<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Cloudflare changelogs</title><description>Updates to various Cloudflare products</description><link>https://developers.cloudflare.com/changelog/</link><item><title>Workers AI - DeepSeek V4 Flash and Pro now available on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2026-08-14-deepseek-v4-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-14-deepseek-v4-workers-ai/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/deepseek-v4-pro-0813/&quot;&gt;&lt;code&gt;@cf/deepseek-ai/deepseek-v4-pro-0813&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/deepseek-v4-flash-0731/&quot;&gt;&lt;code&gt;@cf/deepseek-ai/deepseek-v4-flash-0731&lt;/code&gt;&lt;/a&gt; are now available on Workers AI.&lt;/p&gt;
&lt;p&gt;DeepSeek V4 Flash and DeepSeek V4 Pro are the first Workers AI models with a full &lt;strong&gt;one million (1,048,576) token context window&lt;/strong&gt;. Use them for long-horizon agentic workflows, large codebases, and multi-step reasoning that exceed the context limits of every other model hosted on the platform.&lt;/p&gt;
&lt;p&gt;DeepSeek V4 Flash is the faster, lower-cost sibling. This release supersedes the preview version with substantially enhanced agentic capabilities.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key capabilities:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reasoning&lt;/strong&gt;: Both models support thinking mode for complex, step-by-step problem-solving.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function calling&lt;/strong&gt;: Build agents that invoke tools and APIs across multiple conversation turns.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Long context&lt;/strong&gt;: Both models support a full 1,048,576 token context window.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both models require the &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/pricing/#workers&quot;&gt;Workers Paid plan&lt;/a&gt; or prepaid &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/features/unified-billing/&quot;&gt;AI Gateway credits&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Use these models through the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/bindings/&quot;&gt;Workers AI binding&lt;/a&gt; (&lt;code&gt;env.AI.run()&lt;/code&gt;), the REST API, the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/open-ai-compatibility/&quot;&gt;OpenAI-compatible endpoint&lt;/a&gt;, or &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/deepseek-v4-pro-0813/&quot;&gt;DeepSeek V4 Pro model page&lt;/a&gt;, the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/deepseek-v4-flash-0731/&quot;&gt;DeepSeek V4 Flash model page&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workers, Access - You can now enable Access on a Worker or all Workers at once</title><link>https://developers.cloudflare.com/changelog/post/2026-08-14-workers-access/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-14-workers-access/</guid><description>&lt;p&gt;You now have two new ways to protect your &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Workers&lt;/a&gt; with &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/cloudflare-access/&quot;&gt;Cloudflare Access&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Protect an application across all its domains at once&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Until now, if a Worker was reachable on a route, a Custom Domain, and a &lt;code&gt;workers.dev&lt;/code&gt; URL, you had to manually add each one to an Access application and keep the list in sync whenever routes or domains changed.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1476,height=689,format=webp/_astro/protect-one-worker.BSpeeOry.png&quot; alt=&quot;Access setting for protecting a single Worker&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1476&quot; height=&quot;689&quot;&gt;
&lt;p&gt;&lt;strong&gt;Protect all new and existing Workers by default&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Make all Workers private by default, so every existing and newly created Worker requires sign-in before anyone can reach it.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2436,height=1432,format=webp/_astro/protect-all-workers._AWy-S-E.png&quot; alt=&quot;Account-wide Access setting that protects all Workers&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2436&quot; height=&quot;1432&quot;&gt;
&lt;p&gt;If a specific Worker should remain publicly accessible, add a Worker-level bypass to exempt it.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1228,height=756,format=webp/_astro/make-worker-public.D3yjPjtf.png&quot; alt=&quot;Make a Worker public when all Workers are protected&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1228&quot; height=&quot;756&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For more advanced policy options, edit the policy in &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/one/access/apps&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Zero Trust&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1276,height=1220,format=webp/_astro/choose-who-can-sign-in.DKf3kWAK.png&quot; alt=&quot;Access policy configuration for controlling who can sign in&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1276&quot; height=&quot;1220&quot;&gt;
&lt;p&gt;&lt;strong&gt;View all of your Worker Access policies&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can view and manage all of your Access policies in the &lt;strong&gt;Access&lt;/strong&gt; tab of the Workers &amp;amp; Pages section in the dashboard.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1646,height=1366,format=webp/_astro/access-policies.DN7yCwHX.png&quot; alt=&quot;Access tab showing all configured Access policies&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1646&quot; height=&quot;1366&quot;&gt;
&lt;p&gt;&lt;strong&gt;See who is accessing your Worker&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When Access is enabled on your Worker, every authenticated request includes &lt;code&gt;ctx.access&lt;/code&gt;. Call &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/context/#access&quot;&gt;&lt;code&gt;ctx.access.getIdentity()&lt;/code&gt;&lt;/a&gt; to get the user&apos;s email, name, and groups — no manual JWT validation required.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ctx.access) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;      return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Access did not run&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { status: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;401&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; identity&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ctx.access.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getIdentity&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ aud: ctx.access.aud, email: identity?.email });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Test Access locally&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can now test Cloudflare Access locally with &lt;code&gt;wrangler dev&lt;/code&gt;. Add a &lt;code&gt;dev&lt;/code&gt; block to your &lt;code&gt;wrangler.jsonc&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;access&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;dev&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;aud&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-app&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;identity&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;email&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;admin@example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Your Worker will receive this identity through &lt;code&gt;ctx.access&lt;/code&gt; and &lt;code&gt;ctx.access.getIdentity()&lt;/code&gt;, letting you test authenticated and unauthenticated flows without deploying. Remove the &lt;code&gt;dev&lt;/code&gt; block to simulate unauthenticated requests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;API and programmatic access&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can also set up these policies through the &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/cloudflare-access/&quot;&gt;Workers API&lt;/a&gt; instead of the dashboard.&lt;/p&gt;</description><pubDate>Fri, 14 Aug 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Access</category></item><item><title>Artifacts - Data localization support for Artifacts</title><link>https://developers.cloudflare.com/changelog/post/2026-08-13-artifacts-jurisdictions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-13-artifacts-jurisdictions/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Select a jurisdiction when you create a namespace. Every repo in that namespace automatically uses the selected jurisdiction.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/artifacts/namespaces&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;namespace&quot;: &quot;my-eu-namespace&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;jurisdiction&quot;: &quot;eu&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Jurisdictions cannot be changed after namespace creation. If you omit the jurisdiction, Artifacts creates an unrestricted namespace.&lt;/p&gt;
&lt;p&gt;For supported jurisdictions and usage details, refer to &lt;a href=&quot;https://developers.cloudflare.com/artifacts/guides/data-localization/&quot;&gt;Data localization&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate><product>Artifacts</product><category>Artifacts</category></item><item><title>Gateway - Detect and control software package downloads with package registry security</title><link>https://developers.cloudflare.com/changelog/post/2026-08-13-package-protection/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-13-package-protection/</guid><description>&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/&quot;&gt;HTTP policies&lt;/a&gt; using &lt;code&gt;pkg.*&lt;/code&gt; selectors to allow or block package downloads.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;supported-ecosystems&quot;&gt;Supported ecosystems&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#supported-ecosystems&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Gateway detects package downloads for the following ecosystems:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ecosystem&lt;/th&gt;
&lt;th&gt;Namespace&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;Scope (for example, &lt;code&gt;@babel&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PyPI&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RubyGems&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cargo&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Module path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maven&lt;/td&gt;
&lt;td&gt;Group ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NuGet&lt;/td&gt;
&lt;td&gt;--&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;selectors&quot;&gt;Selectors&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#selectors&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In the dashboard, select &lt;strong&gt;Package Ecosystem&lt;/strong&gt; to access the package registry selectors. After selecting a single ecosystem, nested fields for package name, version, and namespace become available. Five &lt;code&gt;pkg.*&lt;/code&gt; selectors are available for HTTP policies with the Allow and Block actions:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Selector&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pkg.ecosystem&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The package ecosystem detected from the request URL.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pkg.name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The package name extracted from the download URL.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pkg.version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The package version, with support for ecosystem-aware comparison operators.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pkg.namespace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The package namespace, when the ecosystem supports one.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pkg.purl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;a href=&quot;https://github.com/package-url/purl-spec&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Package URL (PURL)&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; derived from the detected coordinates. Available in the API only.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Package registry security requires &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/tls-decryption/&quot;&gt;TLS decryption&lt;/a&gt; to be turned on.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/package-registry-security/&quot;&gt;Package registry security&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category></item><item><title>Realtime - Control Realtime SFU DataChannel delivery</title><link>https://developers.cloudflare.com/changelog/post/2026-08-13-datachannels-reliability-ordering/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-13-datachannels-reliability-ordering/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/&quot;&gt;Cloudflare Realtime SFU&lt;/a&gt; is a &lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/calls-vs-sfus/&quot;&gt;WebRTC selective forwarding unit&lt;/a&gt; that runs on Cloudflare&apos;s global network. It forwards audio, video, and application data between WebRTC clients without requiring you to manage SFU infrastructure or regions.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/datachannels/&quot;&gt;DataChannels&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-changed&quot;&gt;What changed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Realtime SFU DataChannels now support unordered and partially reliable delivery. DataChannels remain reliable and ordered by default, so existing channels keep their current behavior.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;choose-delivery-behavior&quot;&gt;Choose delivery behavior&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#choose-delivery-behavior&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Delivery settings answer two questions: whether newer messages can bypass a delayed message, and when the transport should stop retrying delivery.&lt;/p&gt;
&lt;p&gt;Choose the policy that matches how long your payload remains useful:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Goal&lt;/th&gt;
&lt;th&gt;Settings&lt;/th&gt;
&lt;th&gt;Use when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reliable, ordered delivery (default)&lt;/td&gt;
&lt;td&gt;Omit &lt;code&gt;ordered&lt;/code&gt;, &lt;code&gt;maxRetransmits&lt;/code&gt;, and &lt;code&gt;maxPacketLifeTime&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Messages remain useful and must arrive in order&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reliable, unordered delivery&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;ordered: false&lt;/code&gt;; omit both retry fields&lt;/td&gt;
&lt;td&gt;Messages remain useful, but later messages should not wait for earlier messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No retries or ordering&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;ordered: false&lt;/code&gt; and &lt;code&gt;maxRetransmits: 0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The application tolerates message loss and discards out-of-date updates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Limited retries&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;maxRetransmits: &amp;lt;COUNT&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Brief recovery is useful, but repeated retries are not&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time-bounded delivery&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;maxPacketLifeTime: &amp;lt;MILLISECONDS&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A message loses value after a known time window&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;ordered&lt;/code&gt; controls ordering independently from retries. &lt;code&gt;maxRetransmits&lt;/code&gt; and &lt;code&gt;maxPacketLifeTime&lt;/code&gt; are alternative retry budgets, so set at most one for each channel. Omit both for reliable delivery, whether ordered or unordered.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;apply-the-policy-end-to-end&quot;&gt;Apply the policy end to end&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#apply-the-policy-end-to-end&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;code&gt;createDataChannel()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The following example configures unordered delivery with no retransmissions. It begins after you &lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/datachannels/#set-up-a-datachannel&quot;&gt;establish a DataChannel transport on both sessions and complete any required SDP exchange&lt;/a&gt;. Run the API requests from your backend with &lt;code&gt;APP_ID&lt;/code&gt;, &lt;code&gt;APP_TOKEN&lt;/code&gt;, &lt;code&gt;PUBLISHER_SESSION_ID&lt;/code&gt;, and &lt;code&gt;SUBSCRIBER_SESSION_ID&lt;/code&gt; set in your environment.&lt;/p&gt;
&lt;div data-nb-steps class=&quot;steps&quot; data-astro-cid-sfejetki&gt;&lt;ol&gt;
&lt;li&gt;On the publisher session, create the local DataChannel:&lt;/li&gt;
&lt;/ol&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	--url&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://rtc.live.cloudflare.com/v1/apps/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/sessions/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$PUBLISHER_SESSION_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/datachannels/new&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	--header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	--header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	--data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @-&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;dataChannels&quot;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;location&quot;: &quot;local&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;dataChannelName&quot;: &quot;player-state&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;ordered&quot;: false,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;maxRetransmits&quot;: 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;On each subscriber session, pull the remote DataChannel with the same delivery settings:&lt;/li&gt;
&lt;/ol&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	--url&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://rtc.live.cloudflare.com/v1/apps/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/sessions/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$SUBSCRIBER_SESSION_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/datachannels/new&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	--header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	--header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	--data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @-&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;dataChannels&quot;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;location&quot;: &quot;remote&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;sessionId&quot;: &quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$PUBLISHER_SESSION_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;dataChannelName&quot;: &quot;player-state&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;ordered&quot;: false,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;maxRetransmits&quot;: 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;In the publisher and subscriber clients, create the negotiated browser DataChannel with the same settings. In this example, &lt;code&gt;pc&lt;/code&gt; is the active &lt;code&gt;RTCPeerConnection&lt;/code&gt;, and &lt;code&gt;channelId&lt;/code&gt; is the ID returned by the corresponding API request:&lt;/li&gt;
&lt;/ol&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; channel&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; pc.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;createDataChannel&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;player-state&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	negotiated: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	id: channelId,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	ordered: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	maxRetransmits: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/steps/Steps.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;related-documentation&quot;&gt;Related documentation&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#related-documentation&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/&quot;&gt;Realtime SFU overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/datachannels/&quot;&gt;DataChannels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/https-api/&quot;&gt;Connection API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate><product>Realtime</product><category>Realtime</category></item><item><title>SSL/TLS - Certificate Transparency Monitoring is now Generally Available</title><link>https://developers.cloudflare.com/changelog/post/2026-08-13-ct-monitoring-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-13-ct-monitoring-ga/</guid><description>&lt;p&gt;Certificate Transparency Monitoring is now &lt;a href=&quot;https://blog.cloudflare.com/certificate-transparency-monitoring-ga&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;generally available&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; across all Cloudflare plans.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Learn more in the &lt;a href=&quot;https://blog.cloudflare.com/certificate-transparency-monitoring-ga&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;launch blog post&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; or the &lt;a href=&quot;https://developers.cloudflare.com/ssl/edge-certificates/additional-options/certificate-transparency-monitoring/&quot;&gt;CT Monitoring docs&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 13 Aug 2026 00:00:00 GMT</pubDate><product>SSL/TLS</product><category>SSL/TLS</category></item><item><title>Email security - Block emails by content with blocked content rules</title><link>https://developers.cloudflare.com/changelog/post/2026-08-12-blocked-content-rules/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-12-blocked-content-rules/</guid><description>&lt;p&gt;Cloudflare Email security now lets administrators write their own content-based blocking rules. A new &lt;strong&gt;Blocked content&lt;/strong&gt; area under &lt;strong&gt;Policies &amp;amp; rules&lt;/strong&gt; 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.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create rules using either &lt;strong&gt;plaintext&lt;/strong&gt; matches or &lt;strong&gt;regular expressions&lt;/strong&gt; — useful for blocking targeted phishing campaigns, known-bad phrases, or content patterns unique to your organization.&lt;/li&gt;
&lt;li&gt;Choose the &lt;strong&gt;search location&lt;/strong&gt; for each rule: &lt;strong&gt;subject&lt;/strong&gt;, &lt;strong&gt;body&lt;/strong&gt;, or &lt;strong&gt;subject and body&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use the built-in &lt;strong&gt;regular expression checker&lt;/strong&gt; to validate your pattern against sample text before saving, so you can confirm the rule matches what you expect and avoid false positives.&lt;/li&gt;
&lt;li&gt;Matching messages are marked with a malicious &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/email-security/reference/dispositions-and-attributes/&quot;&gt;disposition&lt;/a&gt; and prevented from reaching users&apos; inboxes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Blocked content rules currently only support the block action.&lt;/p&gt;
&lt;p&gt;This feature is available for the following Email security packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise + PhishGuard&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/email-security/settings/detection-settings/blocked-content/&quot;&gt;Blocked content&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 12 Aug 2026 09:00:00 GMT</pubDate><product>Email security</product><category>Email security</category></item><item><title>Cloudflare One, Access - Independent MFA supports FIDO2 for infrastructure applications</title><link>https://developers.cloudflare.com/changelog/post/2026-08-12-fido2-keys-infrastructure-ssh/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-12-fido2-keys-infrastructure-ssh/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/infrastructure-apps/&quot;&gt;Infrastructure&lt;/a&gt; applications support independent multi-factor authentication (MFA) with FIDO2 keys. You can allow &lt;code&gt;ssh_fido2_key&lt;/code&gt;, &lt;code&gt;piv_key&lt;/code&gt;, or both in application-level and policy-level MFA settings.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For setup instructions, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/independent-mfa/#enroll-a-fido2-key-for-infrastructure-apps&quot;&gt;Enroll a FIDO2 key for infrastructure apps&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/mfa-requirements/#infrastructure-applications&quot;&gt;Configure MFA for infrastructure applications&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category><category>Access</category></item><item><title>Gateway, Cloudflare One - MCP protocol detection and AI Security dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-08-12-mcp-detection-and-dashboard/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-12-mcp-detection-and-dashboard/</guid><description>&lt;p&gt;Cloudflare Gateway now automatically detects &lt;a href=&quot;https://www.cloudflare.com/learning/ai/what-is-model-context-protocol-mcp/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Model Context Protocol (MCP)&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;mcp-policy-selector&quot;&gt;MCP policy selector&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#mcp-policy-selector&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A new &lt;strong&gt;Is MCP&lt;/strong&gt; selector (&lt;code&gt;experimental.is_mcp&lt;/code&gt;) is available in &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/#is-mcp&quot;&gt;HTTP policies&lt;/a&gt;. Use this selector to build Gateway rules that allow, block, or isolate MCP traffic.&lt;/p&gt;
&lt;p&gt;This selector is currently in beta and may change before general availability.&lt;/p&gt;
&lt;p&gt;For example, the following policy blocks MCP traffic that does not arrive through an approved &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/&quot;&gt;MCP portal&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Selector&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Logic&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Is MCP&lt;/td&gt;
&lt;td&gt;is&lt;/td&gt;
&lt;td&gt;&lt;em&gt;True&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;And&lt;/td&gt;
&lt;td&gt;Block&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traffic Source&lt;/td&gt;
&lt;td&gt;is not&lt;/td&gt;
&lt;td&gt;&lt;em&gt;MCP portal&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1104,height=664,format=webp/_astro/gateway-block-unknown-mcp.B2Ainj8x.png&quot; alt=&quot;Example Gateway policy that blocks MCP traffic not arriving through an MCP portal&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1104&quot; height=&quot;664&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ai-security-report&quot;&gt;AI security report&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ai-security-report&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A new &lt;strong&gt;AI security report&lt;/strong&gt; dashboard under &lt;strong&gt;Insights &amp;amp; Logs &amp;gt; Dashboards&lt;/strong&gt; provides visibility into MCP usage across your organization. The dashboard includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Total MCP request volume, unique users, and unique MCP servers&lt;/li&gt;
&lt;li&gt;A timeseries chart of unique MCP servers observed over time&lt;/li&gt;
&lt;li&gt;A summary of Gateway policies that target MCP traffic&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2406,height=928,format=webp/_astro/gateway-mcp-dashboard.C9jPahkp.png&quot; alt=&quot;AI security report dashboard showing MCP detection data including total MCP requests, users, servers, and Gateway policies for MCP&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2406&quot; height=&quot;928&quot;&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/&quot;&gt;HTTP policies&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category><category>Cloudflare One</category></item><item><title>Gateway, Cloudflare One - Traffic Source selector in Gateway policies</title><link>https://developers.cloudflare.com/changelog/post/2026-08-12-traffic-source-selector/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-12-traffic-source-selector/</guid><description>&lt;p&gt;Gateway &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/&quot;&gt;HTTP&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/&quot;&gt;Network&lt;/a&gt; policies now include a &lt;strong&gt;Traffic Source&lt;/strong&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;available-traffic-source-values&quot;&gt;Available traffic source values&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#available-traffic-source-values&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;UI name&lt;/th&gt;
&lt;th&gt;API value&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Device client&lt;/td&gt;
&lt;td&gt;&lt;code&gt;device_client&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Traffic from the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/&quot;&gt;Cloudflare One Client (WARP)&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mesh&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mesh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Traffic from a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;Cloudflare Mesh&lt;/a&gt; connector&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare WAN&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cloudflare_wan&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Traffic from &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/zero-trust/cloudflare-gateway/&quot;&gt;Cloudflare WAN&lt;/a&gt; (Magic WAN)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clientless RDP&lt;/td&gt;
&lt;td&gt;&lt;code&gt;clientless_rdp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Traffic from a clientless RDP session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proxy endpoint&lt;/td&gt;
&lt;td&gt;&lt;code&gt;proxy_endpoint&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Traffic from a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/&quot;&gt;proxy endpoint&lt;/a&gt; (PAC file)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clientless Browser Isolation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;agentless_biso&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Traffic from &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/&quot;&gt;clientless Browser Isolation&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP portal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mcp_portal&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Traffic from an &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/&quot;&gt;MCP portal&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The selector uses the &lt;code&gt;net.onramp.type&lt;/code&gt; API field in both HTTP and Network policies.&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;UI name&lt;/th&gt;
&lt;th&gt;API example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Traffic Source&lt;/td&gt;
&lt;td&gt;&lt;code&gt;net.onramp.type == &quot;device_client&quot;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;browser-isolation-selector&quot;&gt;Browser Isolation selector&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#browser-isolation-selector&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A &lt;strong&gt;Browser Isolation&lt;/strong&gt; selector is also available in Network and HTTP policies. This selector identifies whether the current session is running inside &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/&quot;&gt;Remote Browser Isolation&lt;/a&gt;, allowing administrators to apply different policy behavior to isolated traffic.&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;UI name&lt;/th&gt;
&lt;th&gt;API example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Browser Isolation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;net.is_isolated == true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/&quot;&gt;HTTP policies&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/&quot;&gt;Network policies&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category><category>Cloudflare One</category></item><item><title>Pages - Pages now skips superseded queued builds</title><link>https://developers.cloudflare.com/changelog/post/2026-08-11-skip-superseded-builds/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-11-skip-superseded-builds/</guid><description>&lt;p&gt;Pages now automatically skips a queued build when a newer build for the same project, branch, and deployment target is also queued.&lt;/p&gt;</description><pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate><product>Pages</product><category>Pages</category></item><item><title>Support - New Cloudflare Status page</title><link>https://developers.cloudflare.com/changelog/post/2026-08-11-new-status-page/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-11-new-status-page/</guid><description>&lt;p&gt;The Cloudflare Status page at &lt;a href=&quot;https://www.cloudflarestatus.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.cloudflarestatus.com&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; has been rebuilt. It is available at the same address, and every previously documented &lt;a href=&quot;https://www.cloudflarestatus.com/api&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Status API&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; endpoint remains supported, so existing bookmarks, integrations, and monitoring continue to work.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;notifications-that-fire-even-when-cloudflare-is-down&quot;&gt;Notifications that fire even when Cloudflare is down&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#notifications-that-fire-even-when-cloudflare-is-down&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Maintenance Notification&lt;/strong&gt; and &lt;strong&gt;Incident Alerts&lt;/strong&gt; in &lt;a href=&quot;https://developers.cloudflare.com/notifications/&quot;&gt;Cloudflare Notifications&lt;/a&gt; remain supported, and deliver to the destinations already configured on your account.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;markdown-for-ai-agents&quot;&gt;Markdown for AI agents&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#markdown-for-ai-agents&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Every page on the status page returns Markdown when requested with an &lt;code&gt;Accept: text/markdown&lt;/code&gt; header, so agents can read the current status without parsing HTML:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Accept: text/markdown&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://www.cloudflarestatus.com/locations&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;separate-feeds-for-incidents-and-maintenance&quot;&gt;Separate feeds for incidents and maintenance&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#separate-feeds-for-incidents-and-maintenance&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Incidents and maintenance are published as separate feeds, each available in RSS and Atom, so you can subscribe to one without the other:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;https://www.cloudflarestatus.com/api/v3/incidents.rss&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;https://www.cloudflarestatus.com/api/v3/incidents.atom&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;https://www.cloudflarestatus.com/api/v3/maintenance.rss&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;https://www.cloudflarestatus.com/api/v3/maintenance.atom&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/support/cloudflare-status/&quot;&gt;Cloudflare Status&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate><product>Support</product><category>Support</category></item><item><title>Cloudflare 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 IPs</title><link>https://developers.cloudflare.com/changelog/post/2026-08-11-hostname-routing-ga-public-initial-resolved-ips/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-11-hostname-routing-ga-public-initial-resolved-ips/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://blog.cloudflare.com/tunnel-hostname-routing/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Hostname routing&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; is now generally available. Instead of managing static IP lists and routes, you can route traffic by hostname across multiple Cloudflare One connectors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Tunnel&lt;/strong&gt;: route a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/cloudflared/connect-private-hostname/&quot;&gt;private hostname&lt;/a&gt; (for example, &lt;code&gt;wiki.internal.local&lt;/code&gt;) to a private application behind your tunnel, or a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/egress-policies/egress-cloudflared/&quot;&gt;public hostname&lt;/a&gt; (for example, &lt;code&gt;bank.example.com&lt;/code&gt;) to egress through a specific tunnel and anchor traffic to a dedicated exit node.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Mesh&lt;/strong&gt;: attract a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#hostname-routes&quot;&gt;private or public hostname&apos;s traffic&lt;/a&gt; to a Mesh node.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Alongside GA, the default IPv4 range used for &lt;!-- prettier-ignore --&gt;&lt;span id=&quot;initial resolved IP&quot; data-tooltip data-content=&quot;&lt;p&gt;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 (&lt;code&gt;172.64.128.0/20&lt;/code&gt; by default, configurable per account) or an IPv6 range (&lt;code&gt;2606:4700:0cf1:4000::/64&lt;/code&gt;, not configurable).&lt;/p&gt;
&quot; class=&quot;glossary-tooltip&quot; tabindex=&quot;0&quot; data-astro-cid-hklyqugd&gt;initial resolved IPs&lt;/span&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/GlossaryTooltip.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt; (also called token IPs) is changing from a Carrier-Grade NAT (CGNAT) range to a public Cloudflare-owned range:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IPv4&lt;/strong&gt;: &lt;code&gt;172.64.128.0/20&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPv6&lt;/strong&gt;: &lt;code&gt;2606:4700:0cf1:4000::/64&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the default range. You can &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/routes/configure-initial-resolved-ips/&quot;&gt;configure a custom initial resolved IP range&lt;/a&gt; for IPv4 if it conflicts with your existing network.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Why this is changing:&lt;/strong&gt; Starting with &lt;a href=&quot;https://developer.chrome.com/release-notes/142&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Chrome 142&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, Local Network Access (LNA) restrictions block background requests to CGNAT addresses (&lt;code&gt;100.64.0.0/10&lt;/code&gt;), which included the previous initial resolved IP default (&lt;code&gt;100.80.0.0/16&lt;/code&gt;). 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is affected:&lt;/strong&gt; Initial resolved IPs are used by several features that associate a DNS query with the network connection that follows it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/cloudflared/connect-private-hostname/&quot;&gt;Private&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/egress-policies/egress-cloudflared/&quot;&gt;public&lt;/a&gt; hostname routing for Cloudflare Tunnel&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#hostname-routes&quot;&gt;Hostname routes&lt;/a&gt; for Cloudflare Mesh&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/self-hosted-private-app/&quot;&gt;Access private applications&lt;/a&gt; on non-HTTPS ports&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/egress-policies/host-selectors/&quot;&gt;Egress policy host selectors&lt;/a&gt; (Domain, Host, Application, and Content Categories)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can check your account&apos;s current range, or configure a custom range, at any time from &lt;strong&gt;Zero Trust&lt;/strong&gt; &amp;gt; &lt;strong&gt;Team &amp;amp; Resources&lt;/strong&gt; &amp;gt; &lt;strong&gt;Devices&lt;/strong&gt; &amp;gt; &lt;strong&gt;Device profiles&lt;/strong&gt;, or using the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/subnets/#(resource)%20zero_trust.networks.subnets.initial_resolved_ip&quot;&gt;Initial Resolved IP Subnet API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For full instructions, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/routes/configure-initial-resolved-ips/&quot;&gt;Configure initial resolved IPs&lt;/a&gt;. The IPv6 range (&lt;code&gt;2606:4700:0cf1:4000::/64&lt;/code&gt;) is unchanged and is not affected by this restriction.&lt;/p&gt;
&lt;p&gt;If you were relying on a Chrome Enterprise policy workaround (such as &lt;code&gt;LocalNetworkAccessRestrictionsTemporaryOptOut&lt;/code&gt;) while your account was still on the legacy CGNAT-based range, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/cloudflared/connect-private-hostname/#google-chrome-restricts-access-to-private-hostnames&quot;&gt;Google Chrome restricts access to private hostnames&lt;/a&gt; for next steps.&lt;/p&gt;</description><pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate><product>Cloudflare Tunnel</product><category>Cloudflare Tunnel</category><category>Cloudflare Tunnel for SASE</category><category>Cloudflare Mesh</category><category>Gateway</category><category>Cloudflare One</category></item><item><title>WAF - WAF Release - 2026-08-11</title><link>https://developers.cloudflare.com/changelog/post/2026-08-11-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-11-waf-release/</guid><description>
&lt;p&gt;This release introduces new protection for a remote code execution vulnerability in vBulletin and improves two existing detections.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new detection provides protection against vBulletin CVE-2026-61511.&lt;/li&gt;
&lt;li&gt;Two existing detections have been improved to strengthen coverage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;1b0775f0f092483387cfb23f94f3006b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...94f3006b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;vBulletin - Remote Code Execution - CVE:CVE-2026-61511&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;784d3824b6cf419db6af0b64098b749e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...098b749e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Version Control - Information Disclosure - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule is merged into the original rule &quot;Version Control - Information Disclosure&quot; (ID: &lt;rule-id id=&quot;23548ee2b36547a1be09bb2c0550c529&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...0550c529&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;a561c9138b46470ca6db96edd56225d8&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d56225d8&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;vBulletin - Code Injection - Invalid image format - CVE:CVE-2019-17132 - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule is merged into the original rule &quot;vBulletin - Code Injection - Invalid image format - CVE:CVE-2019-17132&quot; (ID: &lt;rule-id id=&quot;5137834eb8634842852273a08fe9f1c7&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8fe9f1c7&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Tue, 11 Aug 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Cloudflare One Client - Cloudflare One Client for Windows (version 2026.6.905.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-08-10-warp-windows-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-10-warp-windows-ga/</guid><description>&lt;p&gt;A new GA release for the Windows Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
</description><pubDate>Mon, 10 Aug 2026 20:28:46 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare Tunnel, Cloudflare Tunnel for SASE - Stream live logs from Cloudflare Tunnel in the dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-08-10-tunnel-live-logs-core-dashboard/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-10-tunnel-live-logs-core-dashboard/</guid><description>
&lt;p&gt;Real-time Tunnel log streaming is now available in the Cloudflare dashboard under &lt;strong&gt;Networking&lt;/strong&gt; &amp;gt; &lt;strong&gt;Tunnels&lt;/strong&gt;. This brings the same live debugging capability previously only available in the Cloudflare One dashboard, including multi-connector aggregated streaming for high-availability deployments.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=948,format=webp/_astro/tunnel-live-logs-core-dashboard.Dtm7Jg51.gif&quot; alt=&quot;Stream live logs from a tunnel in the Cloudflare dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1800&quot; height=&quot;948&quot;&gt;
&lt;p&gt;In the tunnel detail view, a new &lt;strong&gt;Live logs&lt;/strong&gt; tab lets you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stream logs from single or multiple connectors&lt;/strong&gt; — In &lt;a href=&quot;https://developers.cloudflare.com/tunnel/configuration/#replicas-and-high-availability&quot;&gt;highly available&lt;/a&gt; deployments with multiple &lt;code&gt;cloudflared&lt;/code&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filter by log level, event type, and HTTP method&lt;/strong&gt; — Narrow the stream to only the events you care about (HTTP, TCP, UDP, or &lt;code&gt;cloudflared&lt;/code&gt; internal), at any log level.&lt;/li&gt;
&lt;/ul&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/tunnels&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Tunnels&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/tunnel/monitoring/#remote-log-streaming&quot;&gt;Monitor tunnels&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/monitor-tunnels/logs/&quot;&gt;Tunnel log streams&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate><product>Cloudflare Tunnel</product><category>Cloudflare Tunnel</category><category>Cloudflare Tunnel for SASE</category></item><item><title>Turnstile - Turnstile Spin is now generally available</title><link>https://developers.cloudflare.com/changelog/post/2026-08-10-turnstile-spin-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-10-turnstile-spin-ga/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/turnstile/spin/&quot;&gt;Turnstile Spin&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;server-side-verification&quot;&gt;Server-side verification&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#server-side-verification&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;The Turnstile dashboard flags existing widgets with no matching siteverify traffic. Select &lt;strong&gt;Fix with Spin&lt;/strong&gt; to copy a prompt that guides your agent through wiring siteverify into your backend.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;run-spin&quot;&gt;Run Spin&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#run-spin&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can run Spin three ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the &lt;strong&gt;Turnstile dashboard&lt;/strong&gt;, select &lt;strong&gt;Set up with Spin&lt;/strong&gt;, enter your domains, then select &lt;strong&gt;Set up&lt;/strong&gt;. Spin creates the widget and returns the sitekey, secret, and a prompt for your agent.&lt;/li&gt;
&lt;li&gt;From the &lt;code&gt;Wrangler CLI&lt;/code&gt;, run &lt;a href=&quot;https://developers.cloudflare.com/turnstile/spin/#set-up-from-the-wrangler-cli&quot;&gt;&lt;code&gt;wrangler turnstile widget create&lt;/code&gt;&lt;/a&gt;. Wrangler prints the sitekey and secret. You wire the frontend and siteverify by hand.&lt;/li&gt;
&lt;li&gt;From your &lt;strong&gt;AI coding agent&lt;/strong&gt;, paste the &lt;a href=&quot;https://developers.cloudflare.com/turnstile/spin/#set-up-from-an-ai-coding-agent&quot;&gt;Spin prompt&lt;/a&gt; into Claude Code, Cursor, Codex, OpenCode, or GitHub Copilot Chat. Your agent fetches the skill, creates the widget, then embeds it and wires siteverify.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/turnstile/spin/&quot;&gt;Turnstile Spin documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate><product>Turnstile</product><category>Turnstile</category></item><item><title>AI Gateway, Workers AI - Workers AI and AI Gateway unify model access and billing</title><link>https://developers.cloudflare.com/changelog/post/2026-08-07-workers-ai-unified-billing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-07-workers-ai-unified-billing/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;unified-entrypoints-and-observability&quot;&gt;Unified entrypoints and observability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#unified-entrypoints-and-observability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/worker-binding-methods/&quot;&gt;AI binding&lt;/a&gt; supports both Workers AI and third-party models through &lt;code&gt;env.AI.run()&lt;/code&gt;. The &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/rest-api/&quot;&gt;REST API&lt;/a&gt; provides shared &lt;code&gt;/ai/&lt;/code&gt; endpoints with Cloudflare authentication across providers.&lt;/p&gt;
&lt;p&gt;Route a Workers AI request through AI Gateway by specifying a gateway ID. Use &lt;code&gt;default&lt;/code&gt; to automatically create a gateway on the first authenticated request, or specify an existing gateway to separate applications and workloads:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;@cf/zai-org/glm-5.2&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		messages: [{ role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, content: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;What is the capital of France?&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		gateway: { id: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;default&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;@cf/zai-org/glm-5.2&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		messages: [{ role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, content: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;What is the capital of France?&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		gateway: { id: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;default&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;unified-billing-and-higher-rate-limits&quot;&gt;Unified billing and higher rate limits&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#unified-billing-and-higher-rate-limits&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can now use prepaid &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/features/unified-billing/&quot;&gt;AI Gateway credits&lt;/a&gt; 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&apos;s &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/configuration/manage-gateway/#configure-workers-ai-billing&quot;&gt;Workers AI billing setting&lt;/a&gt; to &lt;strong&gt;Unified billing&lt;/strong&gt;. Workers AI requests routed through that gateway deduct from your credit balance in real time.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.6/&quot;&gt;&lt;code&gt;@cf/moonshotai/kimi-k2.6&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.7-code/&quot;&gt;&lt;code&gt;@cf/moonshotai/kimi-k2.7-code&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/glm-5.2/&quot;&gt;&lt;code&gt;@cf/zai-org/glm-5.2&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These limits are designed for typical agentic and coding workloads, where requests to frontier models can take longer to complete.&lt;/p&gt;
&lt;p&gt;For details, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/limits/&quot;&gt;Workers AI limits&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;Workers AI pricing&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/features/unified-billing/&quot;&gt;Unified Billing&lt;/a&gt;, and the &lt;a href=&quot;https://developers.cloudflare.com/ai/models/&quot;&gt;AI Gateway model catalog&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category><category>Workers AI</category></item><item><title>Hyperdrive - MySQL support in Hyperdrive is now generally available</title><link>https://developers.cloudflare.com/changelog/post/2026-08-07-hyperdrive-mysql-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-07-hyperdrive-mysql-ga/</guid><description>
&lt;p&gt;Support for MySQL in Hyperdrive is now generally available. You can connect to any MySQL database from your Workers using Hyperdrive.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;You can connect using your existing drivers, ORMs, and query builders with Hyperdrive&apos;s secure credentials, with no code changes required. MySQL support is available at the same &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/platform/pricing/&quot;&gt;pricing&lt;/a&gt; as Postgres.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createConnection } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;mysql2/promise&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; connection&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createConnection&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			host: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;HYPERDRIVE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.host,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			user: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;HYPERDRIVE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.user,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			password: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;HYPERDRIVE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.password,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			database: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;HYPERDRIVE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.database,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			port: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;HYPERDRIVE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.port,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			disableEval: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Required for Workers compatibility&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;] &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; connection.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;SHOW tables;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		ctx.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;waitUntil&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(connection.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ results, fields }), {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			headers: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				&quot;Access-Control-Allow-Origin&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;*&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createConnection } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;mysql2/promise&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; interface&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	HYPERDRIVE&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Hyperdrive&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; connection&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createConnection&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			host: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;HYPERDRIVE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.host,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			user: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;HYPERDRIVE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.user,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			password: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;HYPERDRIVE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.password,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			database: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;HYPERDRIVE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.database,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			port: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;HYPERDRIVE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.port,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			disableEval: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Required for Workers compatibility&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;fields&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;] &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; connection.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;SHOW tables;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		ctx.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;waitUntil&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(connection.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ results, fields }), {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			headers: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				&quot;Access-Control-Allow-Origin&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;*&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExportedHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/concepts/how-hyperdrive-works/&quot;&gt;how Hyperdrive works&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/get-started/&quot;&gt;get started building Workers that connect to MySQL with Hyperdrive&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>Cloudflare Mesh, Cloudflare One - Container image for Cloudflare Mesh</title><link>https://developers.cloudflare.com/changelog/post/2026-08-07-mesh-container-image/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-07-mesh-container-image/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;Cloudflare Mesh&lt;/a&gt; nodes can now run as Docker containers. The &lt;a href=&quot;https://hub.docker.com/r/cloudflare/mesh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare/mesh&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; image is available on Docker Hub for Docker Compose, Kubernetes, and any OCI-compatible runtime — no host-level package installation required.&lt;/p&gt;
&lt;p&gt;The image supports &lt;code&gt;amd64&lt;/code&gt; and &lt;code&gt;arm64&lt;/code&gt; architectures and includes built-in &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/containers/#source-nat&quot;&gt;source NAT&lt;/a&gt; so return traffic routes correctly without VPC route table changes.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;deployment-patterns&quot;&gt;Deployment patterns&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#deployment-patterns&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Docker Compose&lt;/strong&gt; — add a &lt;code&gt;cloudflare-mesh&lt;/code&gt; service to your &lt;code&gt;compose.yaml&lt;/code&gt; and connect your entire stack to a private network.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes StatefulSet&lt;/strong&gt; — deploy a standalone Mesh node with persistent registration state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes sidecar&lt;/strong&gt; — add the Mesh image as a sidecar container in a Pod to connect an application to Cloudflare without application changes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI/CD&lt;/strong&gt; — 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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/high-availability/&quot;&gt;high availability&lt;/a&gt;, run multiple replicas with the same Mesh node token. Cloudflare operates replicas in active-passive mode with automatic failover.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/mesh&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Mesh&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;
&lt;p&gt;For setup steps, runtime configuration, and deployment examples, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/containers/&quot;&gt;Run Mesh in Docker / Kubernetes&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate><product>Cloudflare Mesh</product><category>Cloudflare Mesh</category><category>Cloudflare One</category></item><item><title>Radar - AS-level connectivity and upstream providers on Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-08-07-radar-as-connectivity-upstreams/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-07-radar-as-connectivity-upstreams/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; expands its &lt;a href=&quot;https://radar.cloudflare.com/routing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Routing section&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; with two widgets on AS pages, such as &lt;a href=&quot;https://radar.cloudflare.com/routing/as13335&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AS13335&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, that describe how a network reaches the rest of the Internet: the paths it takes toward the &lt;a href=&quot;https://en.wikipedia.org/wiki/Tier_1_network&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Tier-1&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; networks, and the mix of direct upstreams carrying its routes. Both are derived from &lt;a href=&quot;https://www.routeviews.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RouteViews&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; RIB snapshots, unioned across selected collectors.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;as-level-connectivity&quot;&gt;AS-level connectivity&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#as-level-connectivity&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;strong&gt;AS-level connectivity&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;By default, the graph shows the network&apos;s direct connections to Tier-1 networks plus the indirect paths, which keeps the view readable. A &lt;strong&gt;Show full paths&lt;/strong&gt; 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1526,format=webp/_astro/as-level-connectivity-graph.DGv8lrUx.png&quot; alt=&quot;AS-level connectivity graph for AS13335, showing Tier-1 networks it reaches directly alongside paths that reach others through intermediate networks&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;1526&quot;&gt;
&lt;p&gt;This is the AS-level counterpart to the &lt;strong&gt;Real-time connectivity&lt;/strong&gt; graph on prefix pages, such as the one for &lt;a href=&quot;https://radar.cloudflare.com/routing/prefix/1.1.1.0/24&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;1.1.1.0/24&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. 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&apos;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 &lt;a href=&quot;https://developers.cloudflare.com/radar/glossary/#bgp-real-time-routes&quot;&gt;BGP real-time routes&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upstream-providers&quot;&gt;Upstream providers&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upstream-providers&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;strong&gt;Upstream providers&lt;/strong&gt; widget tracks the share of an AS&apos;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 &lt;strong&gt;Other&lt;/strong&gt;. 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=976,format=webp/_astro/as-upstream-providers-timeseries.BUc6CJaT.png&quot; alt=&quot;Stacked area chart of the share of AS13335&apos;s observed paths carried by each of its top 10 direct upstreams, with the remainder grouped into Other&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;976&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;api-endpoints&quot;&gt;API endpoints&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#api-endpoints&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The data behind both widgets is also available through two new endpoints on the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/bgp/&quot;&gt;&lt;code&gt;BGP&lt;/code&gt;&lt;/a&gt; API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/routes/subresources/paths/methods/list/&quot;&gt;&lt;code&gt;/bgp/routes/paths/{asn}&lt;/code&gt;&lt;/a&gt; — 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 &lt;code&gt;collector&lt;/code&gt; to scope the result to a single RouteViews collector.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/routes/subresources/upstreams/methods/timeseries/&quot;&gt;&lt;code&gt;/bgp/routes/upstreams/{asn}/timeseries&lt;/code&gt;&lt;/a&gt; — Returns the share of an AS&apos;s observed paths carried by each direct upstream over time. Use &lt;code&gt;limit&lt;/code&gt; to control how many upstreams come back as separate series before the rest are grouped into an &lt;code&gt;OTHER&lt;/code&gt; series, and &lt;code&gt;ipVersion&lt;/code&gt; to select the address family.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://radar.cloudflare.com/routing/as13335&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AS13335 routing page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to explore both widgets, or swap in any other AS number.&lt;/p&gt;</description><pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Radar - Radar Researcher beta and WebMCP support now available</title><link>https://developers.cloudflare.com/changelog/post/2026-08-07-radar-researcher-and-webmcp/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-07-radar-researcher-and-webmcp/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Cloudflare Radar&lt;/strong&gt;&lt;/a&gt; now includes &lt;a href=&quot;https://radar.cloudflare.com/?prompt=&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Radar Researcher&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1430,height=780,format=webp/_astro/radar-researcher-panel.B7QqJlGo.webp&quot; alt=&quot;Screenshot of the Radar Researcher panel alongside the Radar overview page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1430&quot; height=&quot;780&quot;&gt;
&lt;p&gt;To ask about a specific chart, select &lt;strong&gt;Explain with AI&lt;/strong&gt; to start a conversation with its underlying data and context.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=434,height=302,format=webp/_astro/radar-explain-with-ai.Dgw4ghVh.webp&quot; alt=&quot;Screenshot of the Explain with AI option in a Radar chart menu&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;434&quot; height=&quot;302&quot;&gt;
&lt;p&gt;You can explore further with suggested follow-up questions, find earlier conversations through searchable history, and share conversations through shareable links.&lt;/p&gt;
&lt;p&gt;Alongside the user-facing Researcher experience, Radar now supports &lt;a href=&quot;https://developers.cloudflare.com/browser-run/features/webmcp/&quot;&gt;WebMCP&lt;/a&gt;, allowing browser-based AI agents to navigate Radar, search data, and use tools such as URL scanning and domain lookup.&lt;/p&gt;
&lt;p&gt;To get started, visit &lt;a href=&quot;https://radar.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Radar&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Sandbox SDK - Sandbox SDK 1.0 preview on @next</title><link>https://developers.cloudflare.com/changelog/post/2026-08-07-sandbox-sdk-1-0-preview/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-07-sandbox-sdk-1-0-preview/</guid><description>
&lt;p&gt;&lt;strong&gt;Sandbox SDK 1.0&lt;/strong&gt; is available to preview under the npm &lt;code&gt;@next&lt;/code&gt; tag. For existing applications, the current stable package remains published on the 0.12.x line.&lt;/p&gt;
&lt;p&gt;Sandbox SDK first shipped to provide a rich library for running untrusted and agent-driven work on &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Cloudflare Containers&lt;/a&gt;. Since then, both Sandbox and Containers have matured. This preview is a thinner SDK built on a richer Cloudflare Containers foundation.&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-npm&quot; id=&quot;pm-tab-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-npm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-yarn&quot; id=&quot;pm-tab-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-yarn&quot; data-nb-pm-tab class=&quot;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&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-pnpm&quot; id=&quot;pm-tab-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-pnpm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-bun&quot; id=&quot;pm-tab-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-bun&quot; data-nb-pm-tab class=&quot;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&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-npm&quot; aria-labelledby=&quot;pm-tab-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i @cloudflare/sandbox@next&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i @cloudflare/sandbox@next&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-yarn&quot; aria-labelledby=&quot;pm-tab-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add @cloudflare/sandbox@next&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add @cloudflare/sandbox@next&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add @cloudflare/sandbox@next&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add @cloudflare/sandbox@next&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-bun&quot; aria-labelledby=&quot;pm-tab-pm-64e901be-08a0-4ce8-8932-6b73840f30b8-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add @cloudflare/sandbox@next&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add @cloudflare/sandbox@next&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-this-preview-is&quot;&gt;What this preview is&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-this-preview-is&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A single execution interface&lt;/strong&gt; — &lt;code&gt;sandbox.exec()&lt;/code&gt; takes an argument list, returns when the process &lt;strong&gt;starts&lt;/strong&gt;, and gives you a handle for output, logs, waits, and signals. Both short commands and long-running services use the same API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Removed session execution&lt;/strong&gt; — the SDK no longer maintains shell state between executions. Each launch is independent. Pass &lt;code&gt;cwd&lt;/code&gt; and &lt;code&gt;env&lt;/code&gt; when you need them, or put multi-step shell syntax in one explicit shell command.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RPC as the only transport&lt;/strong&gt; — the SDK talks to the container exclusively over RPC. Remove &lt;code&gt;SANDBOX_TRANSPORT&lt;/code&gt;, &lt;code&gt;transport&lt;/code&gt; on &lt;code&gt;getSandbox()&lt;/code&gt;, and &lt;code&gt;setTransport()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved PTY and terminal interface&lt;/strong&gt; — interactive PTYs use &lt;code&gt;createTerminal&lt;/code&gt; / &lt;code&gt;connect&lt;/code&gt;, not the older session-shaped helpers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code interpreter as an extension&lt;/strong&gt; — configure the code interpreter on your &lt;code&gt;Sandbox&lt;/code&gt; subclass so you only ship what you need.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Start new projects on &lt;code&gt;@next&lt;/code&gt;. Migrate existing apps when you can so you are ready when 1.0 becomes stable. Deploy the Worker package and container image from the &lt;strong&gt;same&lt;/strong&gt; &lt;code&gt;@next&lt;/code&gt; line.&lt;/p&gt;
&lt;p&gt;Coding agents: install &lt;a href=&quot;https://github.com/cloudflare/skills&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Skills&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; (&lt;a href=&quot;https://developers.cloudflare.com/agent-setup/&quot;&gt;Agent setup&lt;/a&gt;). Use &lt;strong&gt;&lt;code&gt;sandbox-next&lt;/code&gt;&lt;/strong&gt; for &lt;code&gt;@next&lt;/code&gt; (recommended for new projects), &lt;strong&gt;&lt;code&gt;sandbox-stable&lt;/code&gt;&lt;/strong&gt; for the current stable package, and &lt;strong&gt;&lt;code&gt;sandbox-migrate-to-next&lt;/code&gt;&lt;/strong&gt; when you are ready to port. Stable-package deprecated-API cleanup is in the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/guides/2026-deprecation/&quot;&gt;2026 deprecation guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The main &lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandbox documentation&lt;/a&gt; still describes today&apos;s stable package. Preview docs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/sandbox/1-0-preview/&quot;&gt;1.0 preview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/sandbox/1-0-preview/get-started/&quot;&gt;Get started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/sandbox/1-0-preview/migrate/&quot;&gt;Migrate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/sandbox/1-0-preview/processes/&quot;&gt;Processes&lt;/a&gt; · &lt;a href=&quot;https://developers.cloudflare.com/sandbox/1-0-preview/terminals/&quot;&gt;Terminals&lt;/a&gt; · &lt;a href=&quot;https://developers.cloudflare.com/sandbox/1-0-preview/errors/&quot;&gt;Errors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/sandbox/1-0-preview/api/&quot;&gt;API reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/sandbox/bridge/&quot;&gt;stable bridge&lt;/a&gt; with the matching stable package and container image.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;timeline-for-10&quot;&gt;Timeline for 1.0&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#timeline-for-10&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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 (&lt;code&gt;@next&lt;/code&gt;) alongside the current stable release.&lt;/p&gt;</description><pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate><product>Sandbox SDK</product><category>Sandbox SDK</category></item><item><title>WAF - WAF Release - 2026-08-07</title><link>https://developers.cloudflare.com/changelog/post/2026-08-07-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-07-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The WordPress changes update rule metadata only; detection behavior and actions remain unchanged.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;d3852d0891634686a46114069c6dff1c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...9c6dff1c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Wordpress - XSS - CVE:CVE-2026-64638&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Rule metadata description refined. Detection unchanged.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Free Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;5bdf578fff504b8cbe3b7f699ab5ed95&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...9ab5ed95&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Wordpress - XSS - CVE:CVE-2026-64638&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Rule metadata description refined. Detection unchanged.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;95a84ab1645a49c685648c17761e7a4c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...761e7a4c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Command Injection - Obfuscation&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;Detection logic has been deprecated&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Fri, 07 Aug 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>AI Search - AI Search makes it easier to build a search engine for your data</title><link>https://developers.cloudflare.com/changelog/post/2026-08-06-public-endpoint-custom-domains-and-namespaces/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-06-public-endpoint-custom-domains-and-namespaces/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Each of the following is a new option. The previous behavior is still the default, so nothing changes until you change it.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;serve-search-from-your-own-domain&quot;&gt;Serve search from your own domain&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#serve-search-from-your-own-domain&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/retrieval/public-endpoint/&quot;&gt;public endpoint&lt;/a&gt; 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 &lt;code&gt;search.ai.cloudflare.com&lt;/code&gt;. You can now serve the same endpoint from a &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/retrieval/public-endpoint/custom-domains/&quot;&gt;custom domain&lt;/a&gt;, a hostname in a zone that you own:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;https://search.example.com/search&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;restrict-who-can-query-your-content&quot;&gt;Restrict who can query your content&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#restrict-who-can-query-your-content&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Once your endpoint is on your own domain, you can put &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/retrieval/public-endpoint/cloudflare-access/&quot;&gt;Cloudflare Access&lt;/a&gt; in front of it. For example, you usually want to give &lt;code&gt;/mcp&lt;/code&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;search-several-instances-from-one-url&quot;&gt;Search several instances from one URL&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#search-several-instances-from-one-url&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A namespace can expose its own &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/retrieval/public-endpoint/namespace/&quot;&gt;public endpoint&lt;/a&gt; with &lt;code&gt;/search&lt;/code&gt;, &lt;code&gt;/chat/completions&lt;/code&gt;, and &lt;code&gt;/mcp&lt;/code&gt; paths that fan out across the instances you choose:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://ns-&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;NAMESPACE_ENDPOINT_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.search.ai.cloudflare.com/search&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;messages&quot;: [{ &quot;content&quot;: &quot;How do I configure AI Search?&quot;, &quot;role&quot;: &quot;user&quot; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;ai_search_options&quot;: { &quot;instance_ids&quot;: [&quot;docs&quot;, &quot;support&quot;] }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;index-your-sites-without-a-sitemap&quot;&gt;Index your sites without a sitemap&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#index-your-sites-without-a-sitemap&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Website data sources support a new &lt;code&gt;discover&lt;/code&gt; &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/website/parse-types/&quot;&gt;parse type&lt;/a&gt;. It starts at the source URL and collects pages from both your sitemaps and the links it finds while crawling:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&amp;lt;ACCOUNT_ID&amp;gt;/ai-search/instances&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &amp;lt;API_TOKEN&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;id&quot;: &quot;my-ai-search&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;type&quot;: &quot;web-crawler&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;source&quot;: &quot;example.com&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;source_params&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;web_crawler&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;parse_type&quot;: &quot;discover&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;discover_options&quot;: { &quot;source&quot;: &quot;links&quot;, &quot;limit&quot;: 5000, &quot;depth&quot;: 3 }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To learn more, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Browser Run - Introducing Kitesurf, an agent-first browser on Browser Run</title><link>https://developers.cloudflare.com/changelog/post/2026-08-06-kitesurf/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-06-kitesurf/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/kitesurf/&quot;&gt;Kitesurf&lt;/a&gt; is Cloudflare&apos;s new stateless, highly scalable browser that runs entirely on top of &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Workers&lt;/a&gt; and is designed for AI agents. It is available for free while in beta.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Your existing clients already work. To opt in, add the &lt;code&gt;browser=kitesurf&lt;/code&gt; parameter to any Browser Run &lt;a href=&quot;https://developers.cloudflare.com/browser-run/cdp/&quot;&gt;CDP&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/&quot;&gt;Quick Action&lt;/a&gt; endpoint:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;https://api.cloudflare.com/client/v4/accounts/&amp;lt;ACCOUNT_ID&amp;gt;/browser-run/screenshot?browser=kitesurf&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer &amp;lt;API_TOKEN&amp;gt;&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;url&quot;: &quot;https://example.com&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --output&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;screenshot.png&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;You can also explore Kitesurf without writing any code in the &lt;a href=&quot;https://kitesurf.cloudflare.app/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;public playground&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/kitesurf/&quot;&gt;Kitesurf documentation&lt;/a&gt; and the &lt;a href=&quot;https://blog.cloudflare.com/kitesurf&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;blog announcement&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 06 Aug 2026 00:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>AI Gateway - Track AI spend and catch anomalous usage with User Insights</title><link>https://developers.cloudflare.com/changelog/post/2026-08-05-user-insights/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-05-user-insights/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;On the security side, User Insights baselines each user&apos;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&apos;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.&lt;/p&gt;
&lt;p&gt;User Insights is available to all AI Gateway customers at no additional cost.&lt;/p&gt;</description><pubDate>Wed, 05 Aug 2026 20:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>AI Gateway, Access - Identity-aware controls are now available in AI Gateway</title><link>https://developers.cloudflare.com/changelog/post/2026-08-05-access-user-id-metadata/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-05-access-user-id-metadata/</guid><description>&lt;p&gt;AI Gateway now integrates with Cloudflare Access, giving you two new capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Protect your gateway endpoint.&lt;/strong&gt; Put your AI Gateway behind Access so you can set policies that control who is allowed to call a specific gateway&apos;s endpoint.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identity-aware controls.&lt;/strong&gt; When traffic reaches AI Gateway through an Access-protected custom domain, AI Gateway can use the authenticated user&apos;s Access identity in logs, analytics, routing, and spend controls.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;code&gt;cf.user_id&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For setup instructions, refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/configuration/cloudflare-access/&quot;&gt;Cloudflare Access&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category><category>Access</category></item><item><title>Cloudflare Fundamentals - Improved publisher verification details on OAuth consent screens</title><link>https://developers.cloudflare.com/changelog/post/2026-08-04-oauth-consent-shields/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-04-oauth-consent-shields/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Green filled shield&lt;/strong&gt;: Cloudflare owns and manages the application.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blue outlined shield&lt;/strong&gt;: A third-party application with verified ownership of its domain.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amber filled shield&lt;/strong&gt;: A third-party application without verified ownership of a domain.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Domain verification only confirms that the application owner controls the displayed domain.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/oauth/authorizing-an-application/&quot;&gt;Authorizing an application&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Agents, Workers - Agent traces for Think, Flue, and AI SDK instrumented by Agents SDK</title><link>https://developers.cloudflare.com/changelog/post/2026-08-04-agent-tracing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-04-agent-tracing/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Turn on Workers tracing in your Wrangler configuration:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;observability&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;traces&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;enabled&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;observability&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;traces&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;enabled = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;Think and Flue applications emit agent traces automatically. For direct AI SDK calls, wrap the AI SDK namespace once. &lt;code&gt;wrapAISDK()&lt;/code&gt; supports AI SDK v6 and v7. This AI SDK v7 example also supplies the agent identity:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; as&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ai &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { wrapAISDK } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/observability/ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tracedAI&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; wrapAISDK&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(ai);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; tracedAI.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;generateText&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	prompt: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Find an available appointment&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	runtimeContext: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		agentId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;booking-agent-production&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		conversationId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;conversation-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	telemetry: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		functionId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;booking-agent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		includeRuntimeContext: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			agentId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			conversationId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; as&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ai &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { wrapAISDK } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/observability/ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tracedAI&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; wrapAISDK&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(ai);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; tracedAI.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;generateText&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	prompt: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Find an available appointment&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	runtimeContext: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		agentId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;booking-agent-production&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		conversationId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;conversation-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	telemetry: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		functionId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;booking-agent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		includeRuntimeContext: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			agentId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			conversationId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Message and tool payload recording is off by default. Turn it on only when the payloads are safe to store:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tracedAI&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; wrapAISDK&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(ai, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	storeMessages: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	storeTools: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tracedAI&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; wrapAISDK&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(ai, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	storeMessages: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	storeTools: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Open the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Agents&lt;/strong&gt; tab&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; in the Cloudflare dashboard to inspect sessions, replay conversations, and view trace waterfalls. For advanced setup, privacy controls, and trace structure, refer to &lt;a href=&quot;https://developers.cloudflare.com/agents/runtime/operations/observability/tracing/&quot;&gt;Agent tracing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Artifacts, Workflows - Build and deploy Artifacts repos on every push</title><link>https://developers.cloudflare.com/changelog/post/2026-08-04-build-and-deploy-on-push/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-04-build-and-deploy-on-push/</guid><description>
&lt;p&gt;You can now run your CI/CD pipeline on your &lt;a href=&quot;https://developers.cloudflare.com/artifacts/&quot;&gt;Artifacts&lt;/a&gt; repo by defining a CI &lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflow&lt;/a&gt; with the &lt;a href=&quot;https://github.com/cloudflare/ci&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CI SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, automatically triggered on Artifacts push events.&lt;/p&gt;
&lt;p&gt;This allows you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automatically build and deploy application code stored in Artifacts.&lt;/li&gt;
&lt;li&gt;Run linting, type checking, tests, and other checks on every push.&lt;/li&gt;
&lt;li&gt;Reuse dependencies when the lockfile (i.e. &lt;code&gt;pnpm-lock.yaml&lt;/code&gt;) has not changed.&lt;/li&gt;
&lt;li&gt;Stop deployment when a check or build fails.&lt;/li&gt;
&lt;li&gt;Restrict API token access to the deployment step.&lt;/li&gt;
&lt;li&gt;Deploy the output to a &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Worker&lt;/a&gt; or a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/&quot;&gt;Workers for Platforms&lt;/a&gt; User Worker.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Define your CI steps with &lt;code&gt;@cloudflare/ci&lt;/code&gt;. Each &lt;code&gt;ci.runner()&lt;/code&gt; spins up an isolated sandbox, and the &lt;code&gt;cache&lt;/code&gt; option reuses installed dependencies across each sandboxed step in your CI job.&lt;/p&gt;
&lt;p&gt;Point &lt;code&gt;cache.inputs&lt;/code&gt; at your lockfile (i.e. &lt;code&gt;pnpm-lock.yaml&lt;/code&gt;, &lt;code&gt;bun.lock&lt;/code&gt;), and the install step only runs again when that lockfile changes:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; deps&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ci.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;install&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun install --frozen-lockfile&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	cache: { inputs: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;package.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun.lock&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;] },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;([&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;lint&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run lint&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run test&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;typecheck&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run typecheck&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run build&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;deploy&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun wrangler deploy&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; deps&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ci.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;install&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun install --frozen-lockfile&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	cache: { inputs: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;package.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun.lock&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;] },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;([&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;lint&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run lint&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run test&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;typecheck&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run typecheck&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun run build&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; deps.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;deploy&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, command: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bun wrangler deploy&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;To start the Workflow automatically after each push, add a &lt;code&gt;cf.artifacts.repo.pushed&lt;/code&gt; trigger to your Wrangler configuration:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;triggers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;events&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;				&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf.artifacts.repo.pushed&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;				&quot;filter&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;namespace&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;CI&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;repoName&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-repo&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;				&quot;target&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;scriptName&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-ci-worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;workflowName&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ci-workflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;triggers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;events&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;type = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf.artifacts.repo.pushed&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;triggers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;events&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  namespace = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;CI&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  repoName = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-repo&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;triggers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;events&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  scriptName = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-ci-worker&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  workflowName = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ci-workflow&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;To learn more, refer to &lt;a href=&quot;https://developers.cloudflare.com/artifacts/guides/build-and-deploy-on-push/&quot;&gt;Build and deploy Artifacts repos&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><product>Artifacts</product><category>Artifacts</category><category>Workflows</category></item><item><title>Cloudflare Fundamentals - Create Free accounts from the dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-08-04-free-dashboard-button/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-04-free-dashboard-button/</guid><description>&lt;p&gt;You can now create standalone Free accounts directly from the Cloudflare dashboard using the new &lt;strong&gt;Create Account&lt;/strong&gt; button. This feature is currently available to all users.&lt;/p&gt;
&lt;p&gt;When creating a Free account:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can create up to &lt;strong&gt;5 Free accounts&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Your user account must have at least &lt;strong&gt;7 days of tenure&lt;/strong&gt; to be eligible.&lt;/li&gt;
&lt;li&gt;The account is created immediately and ready to use.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To create a Free account, go to the &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Cloudflare dashboard&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and select &lt;strong&gt;Create Account&lt;/strong&gt; from either the account switcher in the top left (where your account name appears) or from the &lt;strong&gt;Accounts&lt;/strong&gt; page.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;limitations&quot;&gt;Limitations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#limitations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;next-steps&quot;&gt;Next steps&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#next-steps&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;After creating your Free account, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/billing/get-started/create-billing-profile/&quot;&gt;Add a payment method&lt;/a&gt; to enable additional Cloudflare products and services.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/billing/get-started/update-billing-info/&quot;&gt;Update billing information&lt;/a&gt; to manage payment methods, billing address, or tax IDs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/billing/understand/how-billing-works/&quot;&gt;Review how Cloudflare billing works&lt;/a&gt; to understand the billing lifecycle and charge types.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/organizations/for-enterprise/&quot;&gt;Assign accounts to an Enterprise Organization&lt;/a&gt; to centrally manage multiple accounts from a single dashboard.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Vectorize - Vectorize indexes now support up to 20 million vectors</title><link>https://developers.cloudflare.com/changelog/post/2026-08-04-index-capacity-20-million/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-04-index-capacity-20-million/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Vectorize continues to support indexes with up to 1,536 dimensions per vector at 32-bit precision. Refer to the &lt;a href=&quot;https://developers.cloudflare.com/vectorize/platform/limits/&quot;&gt;Vectorize limits documentation&lt;/a&gt; for complete details.&lt;/p&gt;</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><product>Vectorize</product><category>Vectorize</category></item><item><title>WAF - WAF Release - 2026-08-04</title><link>https://developers.cloudflare.com/changelog/post/2026-08-04-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-04-waf-release/</guid><description>
&lt;p&gt;This release introduces new rules and updates Microsoft SharePoint RCE alongside enhanced SSRF cloud protection rule actions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CVE-2026-50522: An insecure deserialization vulnerability in Microsoft SharePoint Server. This may allow an unauthenticated attacker to execute arbitrary code using crafted requests.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Generic Cloud Protections: Added improved detection logic targeting Server-Side Request Forgery (SSRF) in cloud-hosted applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;91aee93c31944828bf86f068052b07cf&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...052b07cf&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Microsoft SharePoint - Remote Code Execution - CVE:CVE-2026-50522&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;89d0243997d24c6ea1d610a23a5b40d6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...3a5b40d6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Rails - Arbitrary File Read &amp;amp; RCE - CVE:CVE-2026-66066&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This was labeled as File Upload - RCE.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ae40661b4ef24f9c8abd98338242627b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8242627b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSRF - Local&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt; - &lt;/td&gt;&lt;td&gt;&lt;p&gt;This detection has been removed.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;98bfd6bb46074d5b8d1c4b39743a63ec&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...743a63ec&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSRF - Local - 2 - Beta&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt; - &lt;/td&gt;&lt;td&gt;&lt;p&gt;This detection has been removed.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;54e1733b10da4a599e06c6fbc2e84e2d&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...c2e84e2d&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSRF - Cloud - Beta&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt; - &lt;/td&gt;&lt;td&gt;&lt;p&gt;This detection has been removed.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ecd26d61a75e46f6a4449a06ab8af26f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ab8af26f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSRF - Cloud - 2 - Beta&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt; - &lt;/td&gt;&lt;td&gt;&lt;p&gt;This detection has been removed.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;281a1b7086b84db7a695220725ba9d7c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...25ba9d7c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSRF - Cloud&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;We are changing the action for this rule from Disabled to BLOCK&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;158177dec2504acdba1f2da201a076eb&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...01a076eb&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSRF - Local - Beta&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt; - &lt;/td&gt;&lt;td&gt;&lt;p&gt;This detection has been removed.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - AI agents can debug Workers with local tracing</title><link>https://developers.cloudflare.com/changelog/post/2026-08-04-local-tracing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-04-local-tracing/</guid><description>&lt;p&gt;&lt;code&gt;wrangler dev&lt;/code&gt; and &lt;code&gt;vite dev&lt;/code&gt; automatically capture structured OpenTelemetry traces and correlated console logs during local Worker invocations.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;debug-with-ai-agents&quot;&gt;Debug with AI agents&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#debug-with-ai-agents&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When the tooling detects an AI agent session, it prints a terminal hint pointing to the &lt;a href=&quot;https://developers.cloudflare.com/workers/local-development/local-explorer/#api&quot;&gt;Local Explorer API&lt;/a&gt; at &lt;code&gt;/cdn-cgi/explorer/api&lt;/code&gt;. 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;inspect-traces-in-local-explorer&quot;&gt;Inspect traces in Local Explorer&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#inspect-traces-in-local-explorer&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Humans can inspect the same &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/traces/&quot;&gt;traces&lt;/a&gt; and correlated console logs in the Local Explorer browser UI. Each trace shows spans, timing, attributes, and errors.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2048,height=847,format=webp/_astro/local-trace-failed-request.Bf0avznU.png&quot; alt=&quot;Local Explorer showing a failed Worker trace with spans, timing, and errors&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2048&quot; height=&quot;847&quot;&gt;
&lt;p&gt;Automatic spans cover handler calls, outbound &lt;code&gt;fetch()&lt;/code&gt; calls, and binding calls. Custom spans appear alongside these automatic spans.&lt;/p&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/local-development/local-explorer/&quot;&gt;Local Explorer documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Node.js compatibility is now enabled by default</title><link>https://developers.cloudflare.com/changelog/post/2026-08-04-nodejs-compat-default/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-04-nodejs-compat-default/</guid><description>
&lt;p&gt;Workers now enable the &lt;code&gt;nodejs_compat&lt;/code&gt; and &lt;code&gt;nodejs_compat_v2&lt;/code&gt; compatibility
flags by default for &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/compatibility-dates/&quot;&gt;compatibility dates&lt;/a&gt;
of &lt;code&gt;2026-08-04&lt;/code&gt; or later. These flags are not used for these compatibility
dates because the compatibility date enables the same behavior.&lt;/p&gt;
&lt;p&gt;This means all &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/&quot;&gt;Node.js built-in APIs&lt;/a&gt; supported
by the Workers runtime are available by default, including &lt;code&gt;node:crypto&lt;/code&gt;,
&lt;code&gt;node:buffer&lt;/code&gt;, &lt;code&gt;node:stream&lt;/code&gt;, &lt;code&gt;node:net&lt;/code&gt;, &lt;code&gt;node:dns&lt;/code&gt;, &lt;code&gt;node:fs&lt;/code&gt;, &lt;code&gt;node:http&lt;/code&gt;,
and more. npm packages that depend on these APIs will work without additional
configuration.&lt;/p&gt;
&lt;p&gt;Workers using an earlier compatibility date are not affected. They can still
opt in by adding &lt;code&gt;nodejs_compat&lt;/code&gt; to &lt;code&gt;compatibility_flags&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To turn off Node.js compatibility completely, remove any &lt;code&gt;nodejs_compat&lt;/code&gt; and
&lt;code&gt;nodejs_compat_v2&lt;/code&gt; flags. Then add both of the following flags:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;  // Set this to today&apos;s date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;compatibility_date&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-08-14&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;compatibility_flags&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;no_nodejs_compat&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;no_nodejs_compat_v2&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Set this to today&apos;s date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;compatibility_date = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-08-14&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;compatibility_flags = [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;no_nodejs_compat&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;no_nodejs_compat_v2&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/&quot;&gt;Node.js compatibility documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Access - Control authorization cookies for multi-domain Access applications</title><link>https://developers.cloudflare.com/changelog/post/2026-08-03-eager-redirect-cookie-setting/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-03-eager-redirect-cookie-setting/</guid><description>&lt;p&gt;Cloudflare Access administrators can now control whether a self-hosted application preemptively sets authorization cookies across its public hostnames.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The new &lt;strong&gt;Eager redirect cookie&lt;/strong&gt; setting is turned on by default for new applications. After a user signs in, Access redirects the browser through each hostname and sets a &lt;code&gt;CF_Authorization&lt;/code&gt; cookie. This supports applications that need to make requests across hostnames before the user visits each one.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To configure the setting, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/authorization-cookie/#eager-redirect-cookie&quot;&gt;Authorization cookie&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Agents, Workers - Preview: @cloudflare/computer agent runtime</title><link>https://developers.cloudflare.com/changelog/post/2026-08-03-cloudflare-computer/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-03-cloudflare-computer/</guid><description>&lt;p&gt;We&apos;re releasing an early preview of &lt;a href=&quot;https://github.com/cloudflare/computer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@cloudflare/computer&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/computer&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;Install the package via npm:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/computer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Instantiate a &lt;code&gt;Workspace&lt;/code&gt; inside any Durable Object to give your agent a filesystem and execution runtime:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Workspace } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/computer&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	workspace&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Workspace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		storage: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.storage,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Several execution backends are included or you can write your own:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Isolate runtime&lt;/strong&gt; — fast, horizontally scalable execution via &lt;code&gt;just-bash&lt;/code&gt; and Dynamic Workers, ideal for file manipulation and data processing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Container runtime&lt;/strong&gt; — full Linux environment via Cloudflare Containers, mounted through FUSE, for tasks that need native binaries, package managers, or a complete userland.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The AI SDK-compatible toolkit provides common agent tools (&lt;code&gt;read&lt;/code&gt;, &lt;code&gt;write&lt;/code&gt;, &lt;code&gt;edit&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;exec&lt;/code&gt;) and guides the model to choose the appropriate backend for each task.&lt;/p&gt;
&lt;p&gt;For more examples, including a step-by-step tutorial, visit the &lt;a href=&quot;https://github.com/cloudflare/computer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@cloudflare/computer&lt;/code&gt; repository&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Read the announcement blog post for more details: &lt;a href=&quot;https://blog.cloudflare.com/cloudflare-computer/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Your agent needs a computer, not a container&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Pipelines - Billing is now enabled for Pipelines</title><link>https://developers.cloudflare.com/changelog/post/2026-08-03-pipelines-billing-enabled/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-03-pipelines-billing-enabled/</guid><description>&lt;p&gt;Billing is now enabled for &lt;a href=&quot;https://developers.cloudflare.com/pipelines/&quot;&gt;Cloudflare Pipelines&lt;/a&gt; on non-enterprise accounts. Pipelines usage beyond the included free tier will appear on your next invoice.&lt;/p&gt;
&lt;p&gt;Pipelines charges based on two usage dimensions. Ingress into a Pipeline stream remains free regardless of volume:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SQL transforms&lt;/strong&gt;: $0.04 / GB for stateless transforms (filter, reshape, unnest, cast, compute).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sinks (egress)&lt;/strong&gt;: $0.03 / GB for JSON output, $0.06 / GB for Parquet or Iceberg output.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Workers Paid plans include 50 GB / month for both SQL transforms and sinks. Standard &lt;a href=&quot;https://developers.cloudflare.com/r2/pricing/&quot;&gt;R2 storage and operations&lt;/a&gt; charges apply for data written to R2 buckets, and &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/platform/pricing/&quot;&gt;R2 Data Catalog&lt;/a&gt; charges apply when writing to Iceberg tables.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Usage&lt;/th&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Billable&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Streams&lt;/td&gt;
&lt;td&gt;500 GB&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;0 GB&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SQL transforms&lt;/td&gt;
&lt;td&gt;500 GB&lt;/td&gt;
&lt;td&gt;50 GB&lt;/td&gt;
&lt;td&gt;450 GB&lt;/td&gt;
&lt;td&gt;$18.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sinks (Iceberg)&lt;/td&gt;
&lt;td&gt;300 GB&lt;/td&gt;
&lt;td&gt;50 GB&lt;/td&gt;
&lt;td&gt;250 GB&lt;/td&gt;
&lt;td&gt;$15.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$33.00&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;For full pricing details and billing examples, refer to &lt;a href=&quot;https://developers.cloudflare.com/pipelines/platform/pricing/&quot;&gt;Pipelines pricing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><product>Pipelines</product><category>Pipelines</category></item><item><title>R2, R2 Data Catalog - Billing is now enabled for R2 Data Catalog</title><link>https://developers.cloudflare.com/changelog/post/2026-08-03-r2-data-catalog-billing-enabled/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-03-r2-data-catalog-billing-enabled/</guid><description>&lt;p&gt;Billing is now enabled for &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; on non-enterprise accounts. R2 Data Catalog usage beyond the included free tier will appear on your next invoice.&lt;/p&gt;
&lt;p&gt;R2 Data Catalog charges based on two dimensions, in addition to standard &lt;a href=&quot;https://developers.cloudflare.com/r2/pricing/&quot;&gt;R2 storage and operations&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Catalog operations&lt;/strong&gt;: $9.00 / million operations for metadata requests such as creating tables, reading table metadata, and updating table properties.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compaction&lt;/strong&gt;: $0.005 / GB processed and $2.00 / million objects processed. These charges only apply when &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/table-maintenance/&quot;&gt;automatic compaction&lt;/a&gt; is turned on for a table.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each dimension includes a monthly free tier: 1 million catalog operations, 10 GB of compaction data processed, and 1 million compaction objects processed.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Usage&lt;/th&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Billable&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Catalog operations&lt;/td&gt;
&lt;td&gt;500,000&lt;/td&gt;
&lt;td&gt;1,000,000&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compaction (data processed)&lt;/td&gt;
&lt;td&gt;20 GB&lt;/td&gt;
&lt;td&gt;10 GB&lt;/td&gt;
&lt;td&gt;10 GB&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compaction (objects)&lt;/td&gt;
&lt;td&gt;200,000&lt;/td&gt;
&lt;td&gt;1,000,000&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;$0.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total (Data Catalog)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.05&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Standard R2 storage charges ($0.015 / GB-month) apply separately for the 50 GB of data stored.&lt;/p&gt;
&lt;p&gt;For full pricing details and billing examples, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/platform/pricing/&quot;&gt;R2 Data Catalog pricing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category><category>R2 Data Catalog</category></item><item><title>R2 SQL - Billing is now enabled for R2 SQL</title><link>https://developers.cloudflare.com/changelog/post/2026-08-03-r2-sql-billing-enabled/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-03-r2-sql-billing-enabled/</guid><description>&lt;p&gt;Billing is now enabled for &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; on non-enterprise accounts. R2 SQL usage beyond the included free tier will appear on your next invoice.&lt;/p&gt;
&lt;p&gt;R2 SQL charges based on a single dimension:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data scanned&lt;/strong&gt;: $0.0025 / GB ($2.50 / TB) of compressed data read from R2 to execute your query.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/r2/pricing/&quot;&gt;R2 storage and operations&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/platform/pricing/&quot;&gt;R2 Data Catalog&lt;/a&gt; charges. R2 does not charge for egress, so there is no additional data transfer cost.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Usage&lt;/th&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Billable&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;R2 storage&lt;/td&gt;
&lt;td&gt;500 GB-month&lt;/td&gt;
&lt;td&gt;10 GB-month&lt;/td&gt;
&lt;td&gt;490 GB-month&lt;/td&gt;
&lt;td&gt;$7.35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2 SQL (data scanned)&lt;/td&gt;
&lt;td&gt;50 GB&lt;/td&gt;
&lt;td&gt;10 GB&lt;/td&gt;
&lt;td&gt;40 GB&lt;/td&gt;
&lt;td&gt;$0.10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$7.45&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;For full pricing details and billing examples, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/platform/pricing/&quot;&gt;R2 SQL pricing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Workers - Python and JavaScript Workers can now call each other via RPC</title><link>https://developers.cloudflare.com/changelog/post/2026-08-03-python-javascript-rpc/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-08-03-python-javascript-rpc/</guid><description>
&lt;p&gt;You can now call methods between Python and JavaScript Workers using &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/rpc/&quot;&gt;Workers RPC&lt;/a&gt;. This works through &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/rpc/&quot;&gt;Service bindings&lt;/a&gt; without extra dependencies, schema definitions, or serialization code.&lt;/p&gt;
&lt;p&gt;Cross-language RPC calls behave like ordinary function calls. Exceptions propagate to the call site. You can pass &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm#supported_types&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;structured cloneable types&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; as parameters or return values, and Pyodide Foreign Function Interface (FFI) automatically converts types between languages.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;call-a-typescript-worker-from-python&quot;&gt;Call a TypeScript Worker from Python&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#call-a-typescript-worker-from-python&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Define a method in a TypeScript Worker:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;index.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { WorkerEntrypoint } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; RpcService&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkerEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; a &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; b;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;index.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { WorkerEntrypoint } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; RpcService&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkerEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; a &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; b;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Call it from a Python Worker through a Service binding:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;python&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot; data-nb-lang=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; workers &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response, WorkerEntrypoint&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;WorkerEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; def&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(self, request):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		rpc &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; self&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;RPC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		result &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; rpc.add(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;144&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.json({&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;result&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: result})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Configure the Service binding in the Python Worker&apos;s Wrangler configuration:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;services&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;RPC&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;service&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ts-rpc-server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;entrypoint&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;RpcService&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;RPC&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;service = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ts-rpc-server&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;entrypoint = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;RpcService&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;call-a-python-worker-from-javascript&quot;&gt;Call a Python Worker from JavaScript&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#call-a-python-worker-from-javascript&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Define a method in a Python Worker:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;python&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot; data-nb-lang=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; workers &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; WorkerEntrypoint&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;WorkerEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; def&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; highlight_code&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(self, code: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, language: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) -&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;dict&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		from&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; pygments.formatters &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; HtmlFormatter&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		from&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; pygments &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; highlight&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		from&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; pygments.lexers &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; get_lexer_by_name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		lexer &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; get_lexer_by_name(language, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;stripall&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		formatter &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; HtmlFormatter(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;linenos&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;cssclass&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;highlight&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;monokai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		highlighted_html &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; highlight(code, lexer, formatter)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		css &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; formatter.get_style_defs(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;.highlight&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;html&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: highlighted_html,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;css&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: css&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Call it from a JavaScript Worker through a Service binding:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;index.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; rpc&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;PYTHON_RPC&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; rpc.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;highlight_code&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;print(42)&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;python&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(result);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;index.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; rpc&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;PYTHON_RPC&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; rpc.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;highlight_code&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;print(42)&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;python&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(result);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Configure the Service binding in the JavaScript Worker&apos;s Wrangler configuration:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;services&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PYTHON_RPC&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;service&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;py-rpc-server&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;services&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PYTHON_RPC&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;service = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;py-rpc-server&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;For more details on the announcement, read the &lt;a href=&quot;https://blog.cloudflare.com/python-workers-rpc/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;blog post&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/rpc/&quot;&gt;Workers RPC documentation&lt;/a&gt; and the &lt;a href=&quot;https://developers.cloudflare.com/workers/languages/python/&quot;&gt;Python Workers overview&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare One Client - Cloudflare One Client for Windows (version 2026.7.1210.1)</title><link>https://developers.cloudflare.com/changelog/post/2026-07-31-warp-windows-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-31-warp-windows-beta/</guid><description>&lt;p&gt;A new Beta release for the Windows Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/&quot;&gt;beta releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This beta release includes the following changes and improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Fixed issue where a certificate error could be incorrectly displayed right after the connection is established.&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#dns-search-suffixes&quot;&gt;DNS search domain&lt;/a&gt; parsing failure no longer prevents connection.&lt;/li&gt;
&lt;li&gt;Fixed a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#device-tunnel-protocol&quot;&gt;MASQUE&lt;/a&gt; issue where the tunnel could stall while uploading at a high rate.&lt;/li&gt;
&lt;li&gt;Fixed being unable to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/switch-organizations/&quot;&gt;switch organizations&lt;/a&gt; when the client was stuck in the &amp;quot;Device not in organization&amp;quot; state.&lt;/li&gt;
&lt;li&gt;Fixed the Home Screen dropdown popup not anchoring correctly.&lt;/li&gt;
&lt;li&gt;Fixed a crash during dialog dismissal.&lt;/li&gt;
&lt;li&gt;Increased tolerance for configurations with a large number of &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/&quot;&gt;local domain fallback&lt;/a&gt; resolver IPs, so DNS resolution behaves correctly even when more fallback resolvers are configured than recommended.&lt;/li&gt;
&lt;li&gt;Fixed a networking issue where IPv6 multicast routes were being assigned to the WARP tunnel interface.&lt;/li&gt;
&lt;li&gt;Fixed fatal errors on UI load on Windows 10.&lt;/li&gt;
&lt;li&gt;Fixed a crash during Windows notification initialization.&lt;/li&gt;
&lt;li&gt;Made the Windows &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/client-checks/domain-joined/&quot;&gt;domain-joined posture check&lt;/a&gt; more reliable.&lt;/li&gt;
&lt;li&gt;Fixed orphaned credentials left behind on multi-user uninstall.&lt;/li&gt;
&lt;li&gt;A successful re-authentication will cause the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles/&quot;&gt;device profile&lt;/a&gt; to be re-evaluated.&lt;/li&gt;
&lt;li&gt;Improved &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/client-version-assignments/&quot;&gt;dashboard-managed client updates&lt;/a&gt; by running the updater only when needed.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Fri, 31 Jul 2026 13:55:39 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - Cloudflare One Client for macOS (version 2026.7.1210.1)</title><link>https://developers.cloudflare.com/changelog/post/2026-07-31-warp-macos-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-31-warp-macos-beta/</guid><description>&lt;p&gt;A new Beta release for the macOS Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/&quot;&gt;beta releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This beta release includes the following changes and improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Fixed issue where a certificate error could be incorrectly displayed right after the connection is established.&lt;/li&gt;
&lt;li&gt;A &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#dns-search-suffixes&quot;&gt;DNS search domain&lt;/a&gt; parsing failure no longer prevents connection.&lt;/li&gt;
&lt;li&gt;Fixed a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#device-tunnel-protocol&quot;&gt;MASQUE&lt;/a&gt; issue where the tunnel could stall while uploading at a high rate.&lt;/li&gt;
&lt;li&gt;Fixed being unable to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/switch-organizations/&quot;&gt;switch organizations&lt;/a&gt; when the client was stuck in the &amp;quot;Device not in organization&amp;quot; state.&lt;/li&gt;
&lt;li&gt;Fixed the Home Screen dropdown popup not anchoring correctly.&lt;/li&gt;
&lt;li&gt;Fixed a crash during dialog dismissal.&lt;/li&gt;
&lt;li&gt;Increased tolerance for configurations with a large number of &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/&quot;&gt;local domain fallback&lt;/a&gt; resolver IPs, so DNS resolution behaves correctly even when more fallback resolvers are configured than recommended.&lt;/li&gt;
&lt;li&gt;Fixed the WARP client stealing window focus (for example, during reauth).&lt;/li&gt;
&lt;li&gt;Fixed a client crash when connecting to a captive portal over Wi-Fi.&lt;/li&gt;
&lt;li&gt;Fixed the system tray icon showing &amp;quot;disconnected&amp;quot; while the UI showed &amp;quot;connected&amp;quot;.&lt;/li&gt;
&lt;li&gt;A successful re-authentication will cause the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles/&quot;&gt;device profile&lt;/a&gt; to be re-evaluated.&lt;/li&gt;
&lt;li&gt;Improved &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/client-version-assignments/&quot;&gt;dashboard-managed client updates&lt;/a&gt; by running the updater only when needed.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Fri, 31 Jul 2026 13:55:38 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Access - Static OAuth client credentials for MCP server portals</title><link>https://developers.cloudflare.com/changelog/post/2026-07-31-mcp-portal-manual-oauth/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-31-mcp-portal-manual-oauth/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/&quot;&gt;MCP server portals&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;client_secret_post&lt;/code&gt; and &lt;code&gt;client_secret_basic&lt;/code&gt; token endpoint authentication methods.&lt;/p&gt;
&lt;p&gt;Cloudflare stores the client secret encrypted. Users still authenticate to the upstream server with their own accounts when they connect through a portal.&lt;/p&gt;
&lt;p&gt;For setup instructions, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#configure-manual-oauth-credentials&quot;&gt;Configure manual OAuth credentials&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Browser Run - Browser Run adds a Playground to the Cloudflare dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-07-31-br-dashboard-playground/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-31-br-dashboard-playground/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/&quot;&gt;Browser Run&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/images/browser-run/playground.png&quot; alt=&quot;Browser Run Playground in the Cloudflare dashboard showing a generated screenshot preview and output settings&quot;&gt;
&lt;p&gt;With the Playground, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Capture visuals as &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/screenshot-endpoint/&quot;&gt;screenshots&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/pdf-endpoint/&quot;&gt;PDFs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Generate multiple output formats in one request with the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/snapshot/&quot;&gt;snapshot endpoint&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Extract &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/content-endpoint/&quot;&gt;HTML&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/markdown-endpoint/&quot;&gt;Markdown&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/links-endpoint/&quot;&gt;links&lt;/a&gt;, or &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/scrape-endpoint/&quot;&gt;scraped data&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Extract &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/json-endpoint/&quot;&gt;structured data with AI&lt;/a&gt; using a prompt and optional JSON Schema.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Select &lt;strong&gt;Show Code&lt;/strong&gt; 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:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	BROWSER&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; BrowserRun&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;BROWSER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;quickAction&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;screenshot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			url: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://developers.cloudflare.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			viewport: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				width: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1920&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				height: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1080&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExportedHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Requests made in the Playground incur &lt;a href=&quot;https://developers.cloudflare.com/browser-run/pricing/&quot;&gt;Browser Run charges&lt;/a&gt;. AI extraction also incurs Workers AI charges.&lt;/p&gt;
&lt;p&gt;To try the Playground, go to &lt;strong&gt;Browser Run&lt;/strong&gt; in the Cloudflare dashboard and select &lt;strong&gt;Playground&lt;/strong&gt;.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/browser-run&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Browser Run&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/&quot;&gt;Quick Actions documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>Stream - Rotate Stream broadcast keys for live inputs</title><link>https://developers.cloudflare.com/changelog/post/2026-07-30-rotate-stream-broadcast-keys/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-30-rotate-stream-broadcast-keys/</guid><description>&lt;p&gt;You can now rotate the broadcast credentials for a Stream live input without changing the live input identifier.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To rotate keys for a live input, make a &lt;code&gt;POST&lt;/code&gt; request to the &lt;code&gt;rotate_keys&lt;/code&gt; endpoint:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;https://api.cloudflare.com/client/v4/accounts/{&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;account_id}/stream/live_inputs/&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;{live_input_identifier}&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;/rotate_keys&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;--header &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Authorization: Bearer &amp;lt;API_TOKEN&amp;gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Live input responses now also include &lt;code&gt;keysRotatedAt&lt;/code&gt;, which indicates when the live input keys were last rotated. This field is omitted for live inputs whose keys have never been rotated.&lt;/p&gt;
&lt;p&gt;For endpoint details, refer to &lt;a href=&quot;https://developers.cloudflare.com/api/resources/stream/subresources/live_inputs/methods/rotate_keys/&quot;&gt;Rotate keys for a live input&lt;/a&gt;. For usage guidance, refer to &lt;a href=&quot;https://developers.cloudflare.com/stream/stream-live/start-stream-live/#manage-live-inputs&quot;&gt;Manage live inputs&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate><product>Stream</product><category>Stream</category></item><item><title>Workers, Durable Objects - Inspect Worker startup performance with Wrangler</title><link>https://developers.cloudflare.com/changelog/post/2026-07-31-wrangler-startup-profile-summary/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-31-wrangler-startup-profile-summary/</guid><description>&lt;p&gt;&lt;code&gt;wrangler check startup&lt;/code&gt; now reports your Worker&apos;s raw and compressed bundle sizes. It also summarizes local CPU activity during startup directly in your terminal.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The summary includes sampled, active, garbage collection, and idle time. Wrangler continues to save a &lt;code&gt;.cpuprofile&lt;/code&gt; file for detailed flamegraph analysis in Chrome DevTools or VS Code.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;⛅️&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 4.116.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;───────────────────────────────────────────────&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Building&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; your&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Worker&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Worker&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Built!&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 🎉&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Analysing&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Startup&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; phase&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; analysed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Bundle:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 7171.25&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; KiB&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; gzip:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 2197.00&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; KiB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Local&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; startup&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; profile:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   Profile&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; window:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 70.3&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   Sampled&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; time:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 70.3&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   Active:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 38.5&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ms&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (including &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3.7&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ms&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; garbage&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; collection&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   Idle:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 31.8&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   Samples:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 36&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; CPU&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Profile&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; has&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; been&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; written&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; to&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; worker-startup.cpuprofile.&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Load&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; it&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; into&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Chrome&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; DevTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; profiler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (or &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;directly&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; VSCode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) to view a flamegraph.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Note&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; that&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; CPU&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Profile&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; was&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; measured&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; on&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; your&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Worker&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; running&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; locally&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; on&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; your&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; machine,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; which&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; has&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; different&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; CPU&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; than&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; when&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; your&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Worker&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; runs&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; on&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Cloudflare.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; As&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; such,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; CPU&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Profile&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; can&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; be&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; used&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; to&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; understand&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; where&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; time&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; is&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; spent&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; at&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; startup,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; but&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; overall&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; startup&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; time&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; profile&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; should&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; not&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; be&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; expected&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; to&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; exactly&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; match&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; what&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; your&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Worker&apos;s startup time will be when deploying to Cloudflare.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Available in Wrangler version 4.116.0 or later. For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/workers/#startup&quot;&gt;&lt;code&gt;wrangler check startup&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Durable Objects</category></item><item><title>Access - Admins can turn on Code Mode by default for MCP portal users</title><link>https://developers.cloudflare.com/changelog/post/2026-07-30-mcp-portal-code-mode-policies/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-30-mcp-portal-code-mode-policies/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/&quot;&gt;MCP server portals&lt;/a&gt; now support four Code Mode policies: &lt;em&gt;Off&lt;/em&gt;, &lt;em&gt;Opt-in&lt;/em&gt;, &lt;em&gt;On by default&lt;/em&gt;, and &lt;em&gt;Enforced&lt;/em&gt;. Admins can choose whether Code Mode is unavailable, optional, enabled by default, or required for every session.&lt;/p&gt;
&lt;p&gt;Existing portals retain their current behavior. Portals that previously allowed Code Mode use &lt;em&gt;Opt-in&lt;/em&gt;, while portals that did not allow Code Mode use &lt;em&gt;Off&lt;/em&gt;. New portals also use &lt;em&gt;Opt-in&lt;/em&gt; by default.&lt;/p&gt;
&lt;p&gt;Clients turn on Code Mode for an &lt;em&gt;Opt-in&lt;/em&gt; portal with &lt;code&gt;?codemode=search_and_execute&lt;/code&gt;. The &lt;em&gt;On by default&lt;/em&gt; policy lets clients opt out with &lt;code&gt;?codemode=off&lt;/code&gt;, which avoids nested code execution when a client runs its own Code Mode implementation. The &lt;em&gt;Off&lt;/em&gt; and &lt;em&gt;Enforced&lt;/em&gt; policies ignore client overrides.&lt;/p&gt;
&lt;p&gt;The Cloudflare API exposes these policies through the &lt;code&gt;code_mode&lt;/code&gt; field:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;code_mode&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;default_on&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;The supported values are &lt;code&gt;off&lt;/code&gt;, &lt;code&gt;opt_in&lt;/code&gt;, &lt;code&gt;default_on&lt;/code&gt;, and &lt;code&gt;enforced&lt;/code&gt;. The previous &lt;code&gt;allow_code_mode&lt;/code&gt; boolean is deprecated.&lt;/p&gt;
&lt;p&gt;For configuration details and client behavior, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#code-mode-policies&quot;&gt;Code Mode policies&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>AI Search - Use AI Search with the Agents SDK, AI SDK, and LangChain</title><link>https://developers.cloudflare.com/changelog/post/2026-07-30-ai-search-agent-sdks/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-30-ai-search-agent-sdks/</guid><description>
&lt;p&gt;You can now use &lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; directly from popular agent frameworks, adding grounded retrieval to an existing app instead of calling the REST API by hand. The new &lt;a href=&quot;https://developers.cloudflare.com/ai-search/agent-sdks/&quot;&gt;Agents&lt;/a&gt; section has guides for the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/agent-sdks/ai-sdk/&quot;&gt;Vercel AI SDK&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/ai-search/agent-sdks/langchain/&quot;&gt;LangChain&lt;/a&gt;, and the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/agent-sdks/agents-sdk/&quot;&gt;Cloudflare Agents SDK&lt;/a&gt;. The AI SDK integration is a new package, and the LangChain integration is a new retriever in the existing &lt;code&gt;langchain-cloudflare&lt;/code&gt; package.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;vercel-ai-sdk&quot;&gt;Vercel AI SDK&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#vercel-ai-sdk&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.npmjs.com/package/ai-search-provider&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;ai-search-provider&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; package connects AI Search to the AI SDK, and targets AI SDK v6 (&lt;code&gt;ai@^6&lt;/code&gt;). Pass &lt;code&gt;instance.chat()&lt;/code&gt; to &lt;code&gt;generateText&lt;/code&gt; or &lt;code&gt;streamText&lt;/code&gt; to generate a response grounded in your indexed content, with the retrieved chunks returned as &lt;code&gt;sources&lt;/code&gt;. You can also expose &lt;code&gt;instance.search()&lt;/code&gt; as a tool for agent loops.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createAISearchNamespace } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai-search-provider&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { generateText } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; aiSearch&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createAISearchNamespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ binding: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI_SEARCH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sources&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; generateText&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model: aiSearch.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;knowledge-base&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;chat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	messages: [{ role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, content: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;How does caching work?&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createAISearchNamespace } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai-search-provider&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { generateText } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; aiSearch&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createAISearchNamespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ binding: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI_SEARCH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sources&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; generateText&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model: aiSearch.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;knowledge-base&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;chat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	messages: [{ role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, content: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;How does caching work?&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;langchain&quot;&gt;LangChain&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#langchain&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;langchain-cloudflare&lt;/code&gt; package (&lt;a href=&quot;https://pypi.org/project/langchain-cloudflare/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PyPI&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/cloudflare/langchain-cloudflare&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GitHub&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;) provides &lt;code&gt;CloudflareAISearchRetriever&lt;/code&gt;, a standard LangChain retriever backed by AI Search. Use it on its own, wrap it with &lt;code&gt;create_retriever_tool&lt;/code&gt; 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.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;python&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;python&quot; data-nb-lang=&quot;python&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; langchain_cloudflare &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; CloudflareAISearchRetriever&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;retriever &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; CloudflareAISearchRetriever(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;    account_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;    api_token&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;    instance_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;knowledge-base&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;    retrieval_type&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;hybrid&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;docs &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; retriever.invoke(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;How do I configure Workers AI?&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cloudflare-agents-sdk&quot;&gt;Cloudflare Agents SDK&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cloudflare-agents-sdk&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/agents/&quot;&gt;Cloudflare Agents SDK&lt;/a&gt; could already reach AI Search through the Workers binding. The new &lt;a href=&quot;https://developers.cloudflare.com/ai-search/agent-sdks/agents-sdk/&quot;&gt;guide&lt;/a&gt; walks through building a stateful chat agent that provisions its own instance, indexes content, and searches it from a tool.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { tool } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { z } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;zod&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; instance&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI_SEARCH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;knowledge-base&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Expose AI Search to the agent&apos;s model as a tool it can call.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; searchKnowledgeBase&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; tool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	description: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Search the knowledge base for relevant content.&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	inputSchema: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ query: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	execute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ query }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { tool } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { z } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;zod&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; instance&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI_SEARCH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;knowledge-base&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Expose AI Search to the agent&apos;s model as a tool it can call.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; searchKnowledgeBase&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; tool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	description: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Search the knowledge base for relevant content.&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	inputSchema: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ query: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	execute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ query }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;For the full walkthroughs, including creating an instance and indexing content, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/agent-sdks/&quot;&gt;Agents&lt;/a&gt; guides.&lt;/p&gt;</description><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Workers - Node.js 24 is now the default for Workers Builds</title><link>https://developers.cloudflare.com/changelog/post/2026-07-30-workers-builds-nodejs-24/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-30-workers-builds-nodejs-24/</guid><description>&lt;p&gt;Workers Builds now uses Node.js 24.18.0 by default. The build image preinstalls Node.js 22.23.2 and 24.18.0.&lt;/p&gt;
&lt;p&gt;You can continue to override the default with the &lt;code&gt;NODE_VERSION&lt;/code&gt; environment variable, an &lt;code&gt;.nvmrc&lt;/code&gt; file, or a &lt;code&gt;.node-version&lt;/code&gt; file. For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/build-image/#overriding-default-versions&quot;&gt;Override default versions&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>WAF - WAF Release - 2026-07-29</title><link>https://developers.cloudflare.com/changelog/post/2026-07-29-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-29-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generic Protections (SSRF &amp;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.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;54e1733b10da4a599e06c6fbc2e84e2d&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...c2e84e2d&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSRF - Cloud - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is an improved detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;95a84ab1645a49c685648c17761e7a4c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...761e7a4c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Command Injection - Obfuscation&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;58df9693db4d454a8764fcda7347c892&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...7347c892&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Alibaba Fastjson JSONType Remote Code Execution - Body&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;6159ead63d284147943dc5a18ec012ea&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8ec012ea&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Nuxt Server Island - RCE&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.This was labeled as Generic Rules - RCE.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;dcf635ab2e744e1a994443973590a4ad&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...3590a4ad&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - RCE&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;d3852d0891634686a46114069c6dff1c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...9c6dff1c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - XSS&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;89d0243997d24c6ea1d610a23a5b40d6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...3a5b40d6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;File Upload - RCE&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Free Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;6ad9f2049b094c608be0f8adcfe1a93c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...cfe1a93c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - RCE&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Free Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;5bdf578fff504b8cbe3b7f699ab5ed95&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...9ab5ed95&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - XSS&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Free Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;7ecac499d14a4750aa58c1e21b7f9c67&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1b7f9c67&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;File Upload - RCE&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>1.1.1.1 - Improved DoH JSON formatting for additional record types</title><link>https://developers.cloudflare.com/changelog/post/2026-07-28-improved-record-display-format/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-28-improved-record-display-format/</guid><description>&lt;p&gt;Cloudflare is rolling out updated formatting for the &lt;code&gt;data&lt;/code&gt; field in the 1.1.1.1 &lt;a href=&quot;https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests/dns-json/&quot;&gt;DoH JSON API&lt;/a&gt; (&lt;code&gt;application/dns-json&lt;/code&gt;). During the roll out responses may use either the old or new format.&lt;/p&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/make-api-requests/dns-wireformat/&quot;&gt;DoH wireformat&lt;/a&gt; instead.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;human-readable-display-for-additional-record-types&quot;&gt;Human-readable display for additional record types&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#human-readable-display-for-additional-record-types&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Several record types previously returned their &lt;code&gt;data&lt;/code&gt; field in &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc3597&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 3597&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; generic hex encoding (&lt;code&gt;\# &amp;lt;length&amp;gt; &amp;lt;hex&amp;gt;&lt;/code&gt;). These now use standard presentation format:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;CAA:        0 issue &quot;letsencrypt.org&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;NAPTR:      100 10 &quot;s&quot; &quot;SIP+D2U&quot; &quot;&quot; _sip._udp.example.com.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;RP:         admin.example.com. txt.example.com.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;IPSECKEY:   10 1 2 192.0.2.1 AwEA...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;SVCB:       1 target.example.com. alpn=h2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;HTTPS:      1 . alpn=h3,h2 ipv4hint=192.0.2.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;TLSA:       3 1 1 aabbccdd...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;SSHFP:      1 2 aabbccdd...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;OPENPGPKEY: AwEA...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;numeric-dnssec-algorithm-identifiers&quot;&gt;Numeric DNSSEC algorithm identifiers&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#numeric-dnssec-algorithm-identifiers&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;DNSSEC-related records now use numeric algorithm identifiers as defined in &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc4034&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 4034&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; instead of mnemonic names. This affects &lt;code&gt;RRSIG&lt;/code&gt;, &lt;code&gt;DS&lt;/code&gt;, &lt;code&gt;CDS&lt;/code&gt;, &lt;code&gt;DNSKEY&lt;/code&gt;, and &lt;code&gt;CDNSKEY&lt;/code&gt; records. For example, &lt;code&gt;RSASHA256&lt;/code&gt; becomes &lt;code&gt;8&lt;/code&gt;, &lt;code&gt;ECDSAP256SHA256&lt;/code&gt; becomes &lt;code&gt;13&lt;/code&gt;, and &lt;code&gt;ED25519&lt;/code&gt; becomes &lt;code&gt;15&lt;/code&gt;. DS digest types also change from mnemonic to numeric: &lt;code&gt;SHA-256&lt;/code&gt; becomes &lt;code&gt;2&lt;/code&gt;.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;Before&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;txt&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;RRSIG:  A RSASHA256 2 300 ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;DS:     12345 RSASHA256 SHA-256 aabb...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;DNSKEY: 257 3 RSASHA256 AwEA...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;After&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;txt&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;RRSIG:  A 8 2 300 ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;DS:     12345 8 2 aabb...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;DNSKEY: 257 3 8 AwEA...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;other-formatting-changes&quot;&gt;Other formatting changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#other-formatting-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;HINFO&lt;/code&gt; character-strings are now individually quoted to remove ambiguity when values contain spaces:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;Before&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;txt&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;&quot;data&quot;: &quot;Intel Xeon Linux&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;After&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;txt&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;&quot;data&quot;: &quot;\&quot;Intel Xeon\&quot; \&quot;Linux\&quot;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate><product>1.1.1.1</product><category>1.1.1.1</category></item><item><title>Agents, Workers - Cloudflare MCP servers support the new MCP 2026-07-28 Specification</title><link>https://developers.cloudflare.com/changelog/post/2026-07-28-cloudflare-mcp-servers-mcp-2026-07-28/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-28-cloudflare-mcp-servers-mcp-2026-07-28/</guid><description>&lt;p&gt;Cloudflare&apos;s &lt;a href=&quot;https://developers.cloudflare.com/agents/model-context-protocol/cloudflare/servers-for-cloudflare/#product-specific-mcp-servers&quot;&gt;product-specific MCP servers&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;/mcp&lt;/code&gt; endpoint also accepts stateless requests from 2025 Streamable HTTP clients. Most clients can reconnect without configuration changes.&lt;/p&gt;
&lt;p&gt;Use &lt;code&gt;/mcp&lt;/code&gt; for new connections. Historical &lt;code&gt;/sse&lt;/code&gt; 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.&lt;/p&gt;</description><pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Browser Run - Browser Run adds structured handoff for Human in the Loop</title><link>https://developers.cloudflare.com/changelog/post/2026-07-28-human-in-the-loop/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-28-human-in-the-loop/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/&quot;&gt;Browser Run&lt;/a&gt; now supports structured handoff for &lt;a href=&quot;https://developers.cloudflare.com/browser-run/features/human-in-the-loop/&quot;&gt;Human in the Loop&lt;/a&gt; workflows. Using Cloudflare-specific &lt;a href=&quot;https://developers.cloudflare.com/browser-run/features/human-in-the-loop/#cloudflare-cdp-commands&quot;&gt;CDP commands&lt;/a&gt;, your agent can signal that it needs help, a human steps in through &lt;a href=&quot;https://developers.cloudflare.com/browser-run/features/live-view/&quot;&gt;Live View&lt;/a&gt; to handle the task, and the agent resumes once the work is done.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The following example requests human intervention for a login page and waits for the human to finish before continuing:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; cdp&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; page.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;createCDPSession&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Get Live View URL for the human operator&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;devtoolsFrontendUrl&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; cdp.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Cloudflare.getLiveView&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;tab&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Human input needed: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;devtoolsFrontendUrl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Request human intervention and wait for completion&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; handoffComplete&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	cdp.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Cloudflare.handoffComplete&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, resolve);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; cdp.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Cloudflare.handoff&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	instructions: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Please log in with your credentials&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;600000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; handoffComplete;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(result.success &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Handoff complete&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; `Failed: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;reason&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/features/human-in-the-loop/&quot;&gt;Human in the Loop documentation&lt;/a&gt; for the full API reference, examples, and best practices.&lt;/p&gt;</description><pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>Cloudflare One, Gateway - Control Cloudflare Gateway DNS caching with a maximum TTL setting</title><link>https://developers.cloudflare.com/changelog/post/2026-07-28-gateway-maximum-dns-ttl/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-28-gateway-maximum-dns-ttl/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2170,height=294,format=webp/_astro/gateway-max-ttl-traffic-settings.BRF3NUMp.png&quot; alt=&quot;The maximum DNS TTL setting in Traffic policies &gt; Traffic settings, showing a numeric input field that accepts values between 60 and 36,000 seconds&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2170&quot; height=&quot;294&quot;&gt;
&lt;p&gt;The setting is available at two levels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Account level&lt;/strong&gt; - In &lt;strong&gt;Traffic Policies&lt;/strong&gt; &amp;gt; &lt;strong&gt;Traffic Settings&lt;/strong&gt;, under &lt;strong&gt;Proxy and inspection&lt;/strong&gt;. This sets the default cap for all DNS locations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-location&lt;/strong&gt; - Each &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-proxies/&quot;&gt;DNS location&lt;/a&gt; can inherit the account setting, disable the cap, or override it with a custom value.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Two new fields are also available in DNS logs: &lt;code&gt;upstream_record_ttls&lt;/code&gt; (the original TTL from the upstream response) and &lt;code&gt;applied_max_ttl&lt;/code&gt; (the cap Gateway applied). These appear in the DNS logs column picker and in Logpush datasets.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/dns-policies/maximum-dns-ttl/&quot;&gt;Maximum DNS TTL&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category><category>Gateway</category></item><item><title>Workers AI - Select models now require the Workers Paid plan</title><link>https://developers.cloudflare.com/changelog/post/2026-07-28-models-require-workers-paid/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-28-models-require-workers-paid/</guid><description>&lt;p&gt;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 &lt;code&gt;429&lt;/code&gt; and &lt;code&gt;3040&lt;/code&gt; (Out of Capacity) errors.&lt;/p&gt;
&lt;p&gt;The following models now require the &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/pricing/#workers&quot;&gt;Workers Paid plan&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.6/&quot;&gt;&lt;code&gt;@cf/moonshotai/kimi-k2.6&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.7-code/&quot;&gt;&lt;code&gt;@cf/moonshotai/kimi-k2.7-code&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/glm-5.2/&quot;&gt;&lt;code&gt;@cf/zai-org/glm-5.2&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the Workers Free plan, requests to these models now return a &lt;code&gt;403&lt;/code&gt; HTTP error (&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/errors/&quot;&gt;internal error &lt;code&gt;5035&lt;/code&gt;&lt;/a&gt;) 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 &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;model&apos;s pricing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Many models remain available on the Workers Free plan, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/glm-4.7-flash/&quot;&gt;&lt;code&gt;@cf/zai-org/glm-4.7-flash&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/gemma-4-26b-a4b-it/&quot;&gt;&lt;code&gt;@cf/google/gemma-4-26b-a4b-it&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/nemotron-3-120b-a12b/&quot;&gt;&lt;code&gt;@cf/nvidia/nemotron-3-120b-a12b&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the full list, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/&quot;&gt;Workers AI model catalog&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workers - Workers tracing — write custom spans with new startActiveSpan() and span.end() runtime APIs</title><link>https://developers.cloudflare.com/changelog/post/2026-07-28-start-active-span/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-28-start-active-span/</guid><description>
&lt;p&gt;The Workers runtime now provides built-in &lt;code&gt;tracing.startActiveSpan()&lt;/code&gt; and &lt;code&gt;span.end()&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;This augments the &lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-06-16-custom-spans/&quot;&gt;existing API for writing custom spans&lt;/a&gt;, &lt;code&gt;tracing.enterSpan()&lt;/code&gt;, which automatically ends a span when its callback is returned. With &lt;code&gt;startActiveSpan()&lt;/code&gt;, the span remains open after the callback returns, and you call &lt;code&gt;span.end()&lt;/code&gt; when the work is complete:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { tracing } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; encoder&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; TextEncoder&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; tracing.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;startActiveSpan&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;stream-response&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			let&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; timer;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; body&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ReadableStream&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;				start&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;controller&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					controller.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;enqueue&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(encoder.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Starting...&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					timer &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; setTimeout&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(() &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						controller.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;enqueue&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(encoder.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Complete.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						controller.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						span.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;stream.status&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;complete&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						span.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					}, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;				cancel&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;					if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (timer &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!==&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; undefined&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;clearTimeout&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(timer);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					span.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;stream.status&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cancelled&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					span.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(body, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				headers: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;content-type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text/plain&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { tracing } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; encoder&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; TextEncoder&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; tracing.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;startActiveSpan&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;stream-response&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			let&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; timer&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ReturnType&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;typeof&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; setTimeout&gt; &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; undefined&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; body&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ReadableStream&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Uint8Array&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;				start&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;controller&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					controller.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;enqueue&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(encoder.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Starting...&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					timer &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; setTimeout&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(() &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						controller.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;enqueue&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(encoder.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Complete.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						controller.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						span.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;stream.status&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;complete&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						span.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					}, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;				cancel&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;					if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (timer &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!==&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; undefined&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;clearTimeout&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(timer);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					span.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;stream.status&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cancelled&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					span.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(body, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				headers: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;content-type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text/plain&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/traces/custom-spans/&quot;&gt;custom spans documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Agents, Workers - Agents SDK adds MCP Specification 2026-07-28 support</title><link>https://developers.cloudflare.com/changelog/post/2026-07-27-agents-sdk-v0.20.0-mcp-sdk-v2/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-27-agents-sdk-v0.20.0-mcp-sdk-v2/</guid><description>
&lt;p&gt;Agents SDK v0.20.0 adds client and server support for the &lt;a href=&quot;https://blog.modelcontextprotocol.io/posts/2026-07-28-release-candidate/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MCP 2026-07-28 release candidate&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;client-support&quot;&gt;Client support&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#client-support&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The MCP client manager now uses &lt;code&gt;@modelcontextprotocol/client&lt;/code&gt;. For each connection, it probes for MCP 2026-07-28 support with &lt;code&gt;server/discover&lt;/code&gt;. If the server does not support the stateless protocol, the client continues with the legacy &lt;code&gt;initialize&lt;/code&gt; handshake on the same connection. Existing &lt;code&gt;addMcpServer&lt;/code&gt; calls do not need a protocol-version setting or separate clients for each protocol generation.&lt;/p&gt;
&lt;p&gt;For stateless requests, elicitation uses &lt;code&gt;input_required&lt;/code&gt; 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 &lt;code&gt;callTool&lt;/code&gt;, &lt;code&gt;getPrompt&lt;/code&gt;, or &lt;code&gt;readResource&lt;/code&gt; promise with its final result.&lt;/p&gt;
&lt;p&gt;OAuth callbacks now validate issuer metadata through the v2 SDK. Discovery state and issuer-bound credentials persist across browser redirects and Durable Object hibernation.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;run-stateless-servers&quot;&gt;Run stateless servers&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#run-stateless-servers&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;createMcpHandler&lt;/code&gt; now accepts a factory that returns a server from &lt;code&gt;@modelcontextprotocol/server&lt;/code&gt;. The factory creates an isolated server for each request.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { McpServer } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@modelcontextprotocol/server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createMcpHandler } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/mcp/server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; McpServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;example&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, version: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;1.0.0&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createMcpHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(createServer)(request, env, ctx);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { McpServer } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@modelcontextprotocol/server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createMcpHandler } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/mcp/server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; McpServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;example&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, version: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;1.0.0&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createMcpHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(createServer)(request, env, ctx);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExportedHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;The isolated &lt;code&gt;agents/mcp/server&lt;/code&gt; entry keeps &lt;code&gt;McpAgent&lt;/code&gt;, &lt;code&gt;WorkerTransport&lt;/code&gt;, MCP client transports, and SDK v1 modules out of stateless server bundles.&lt;/p&gt;
&lt;p&gt;The Workers wrapper validates present browser Origins, supports explicit delegation to trusted Origin middleware, and exposes request handling plus typed change notifications.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;backward-compatibility&quot;&gt;Backward compatibility&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#backward-compatibility&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The same &lt;code&gt;createMcpHandler(createServer)(request, env, ctx)&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;McpAgent&lt;/code&gt; is deprecated and feature-frozen. Migrate existing &lt;code&gt;McpAgent&lt;/code&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/agents/model-context-protocol/guides/migrate-to-mcp-sdk-v2/&quot;&gt;migration guide&lt;/a&gt; to design stateless equivalents and run both routes while clients transition.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;migrate-existing-sdk-v1-servers&quot;&gt;Migrate existing SDK v1 servers&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#migrate-existing-sdk-v1-servers&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Upgrade the Agents SDK:&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-npm&quot; id=&quot;pm-tab-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-npm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-yarn&quot; id=&quot;pm-tab-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-yarn&quot; data-nb-pm-tab class=&quot;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&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-pnpm&quot; id=&quot;pm-tab-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-pnpm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-bun&quot; id=&quot;pm-tab-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-bun&quot; data-nb-pm-tab class=&quot;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&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-npm&quot; aria-labelledby=&quot;pm-tab-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i agents@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i agents@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-yarn&quot; aria-labelledby=&quot;pm-tab-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add agents@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add agents@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-bun&quot; aria-labelledby=&quot;pm-tab-pm-3a5bce3a-519c-4a7a-8892-dbb0fa41353f-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add agents@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;Move ordinary SDK v1 server definitions into an SDK v2 factory and serve them with &lt;code&gt;createMcpHandler&lt;/code&gt;. The handler&apos;s default legacy compatibility means most stateless deployments need only one route.&lt;/p&gt;
&lt;p&gt;If an existing &lt;code&gt;McpAgent&lt;/code&gt; server still needs sessionful features, add the stateless path beside it. Use &lt;code&gt;isLegacyRequest()&lt;/code&gt; to send only legacy traffic to the existing route:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { isLegacyRequest } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@modelcontextprotocol/server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createMcpHandler } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/mcp/server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { MyMcpAgent } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;./legacy-server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createServer } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;./server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stateless&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createMcpHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(createServer, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	route: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;/mcp&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	legacy: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;reject&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; legacy&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; MyMcpAgent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;serve&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;/mcp&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; isLegacyRequest&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; legacy.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, env, ctx);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; stateless&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, env, ctx);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { isLegacyRequest } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@modelcontextprotocol/server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createMcpHandler } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/mcp/server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { MyMcpAgent } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;./legacy-server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createServer } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;./server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stateless&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createMcpHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(createServer, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	route: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;/mcp&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	legacy: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;reject&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; legacy&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; MyMcpAgent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;serve&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;/mcp&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExecutionContext&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; isLegacyRequest&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; legacy.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, env, ctx);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; stateless&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, env, ctx);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExportedHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Migrate the remaining sessionful features, allow existing sessions to drain, then remove the legacy route. Refer to &lt;a href=&quot;https://developers.cloudflare.com/agents/model-context-protocol/guides/migrate-to-mcp-sdk-v2/&quot;&gt;Migrate to MCP SDK v2&lt;/a&gt; for package changes, compatibility limits, and rollout steps.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;deprecations-in-v0200&quot;&gt;Deprecations in v0.20.0&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#deprecations-in-v0200&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;This release deprecates the following Agents SDK APIs:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Deprecated API&lt;/th&gt;
&lt;th&gt;Replacement&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;McpAgent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use an SDK v2 factory with &lt;code&gt;createMcpHandler&lt;/code&gt; for stateless servers. Use the migration guide to replace stateful features before removing a legacy route.&lt;/td&gt;
&lt;td&gt;Feature-frozen. No removal version is announced.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;createMcpHandler(v1Server, options)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Move the server to an SDK v2 factory and call &lt;code&gt;createMcpHandler(factory, options)&lt;/code&gt;. Use &lt;code&gt;createLegacyMcpHandler&lt;/code&gt; only as a temporary bridge for sessionful features.&lt;/td&gt;
&lt;td&gt;Scheduled for removal in the next major version.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MCPClientManager.callTool(params, resultSchema, options)&lt;/code&gt; and the equivalent &lt;code&gt;withX402Client&lt;/code&gt; overload&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;callTool(params, options)&lt;/code&gt; or &lt;code&gt;callTool(confirm, params, options)&lt;/code&gt;.&lt;/td&gt;
&lt;td&gt;Compatibility overload. No removal version is announced.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The MCP 2026-07-28 draft separately deprecates Roots, Sampling, Logging, the old HTTP+SSE transport, and Dynamic Client Registration.&lt;/p&gt;</description><pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Audit Logs - Audit Logs v2 — Resource History</title><link>https://developers.cloudflare.com/changelog/post/2026-07-27-audit-logs-v2-resource-history/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-27-audit-logs-v2-resource-history/</guid><description>&lt;p&gt;Audit Logs v2 now includes &lt;strong&gt;Resource History&lt;/strong&gt;. 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1578,height=840,format=webp/_astro/Audit_logs_v2_resource_history.tpxHc9ML.png&quot; alt=&quot;Resource History in Audit Logs v2&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1578&quot; height=&quot;840&quot;&gt;
&lt;p&gt;&lt;strong&gt;Dashboard:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Manage Account&lt;/strong&gt; &amp;gt; &lt;strong&gt;Audit Logs&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Open any audit log entry.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;History&lt;/strong&gt; tab to see the full history for that resource.&lt;/li&gt;
&lt;li&gt;Select any earlier entry to see a side-by-side diff of the fields that changed between it and the current entry.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;API:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Use the History endpoint to retrieve the change history for any audit log entry:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;GET https://api.cloudflare.com/client/v4/accounts/{account_id}/logs/audit/{id}/history&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;The endpoint is also available for organization-scoped audit logs at &lt;code&gt;/organizations/{organization_id}/logs/audit/{id}/history&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/#resource-history&quot;&gt;Resource History documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate><product>Audit Logs</product><category>Audit Logs</category></item><item><title>Workers - Run integration tests against your Worker&apos;s production build</title><link>https://developers.cloudflare.com/changelog/post/2026-07-21-integration-test-harness/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-21-integration-test-harness/</guid><description>
&lt;p&gt;Wrangler now provides &lt;code&gt;createTestHarness()&lt;/code&gt;, an API for running integration tests against Workers built with &lt;a href=&quot;https://developers.cloudflare.com/workers/testing/test-harness/configure/#configure-worker-projects&quot;&gt;Wrangler or the Cloudflare Vite plugin&lt;/a&gt; from any Node.js test runner.&lt;/p&gt;
&lt;p&gt;The test harness starts a local Worker server with &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/api/#createtestharness&quot;&gt;helpers for dispatching requests, resetting storage, and inspecting runtime logs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is useful for tests that need to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/testing/test-harness/interact-with-workers/#test-route-dispatch-across-workers&quot;&gt;Route requests across multiple Workers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/testing/test-harness/integrations/#mock-service-worker&quot;&gt;Mock outbound &lt;code&gt;fetch()&lt;/code&gt; requests&lt;/a&gt; with Node.js request mocking libraries such as &lt;a href=&quot;https://mswjs.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MSW&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/testing/test-harness/integrations/#playwright&quot;&gt;Run Playwright tests against a Worker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, this test starts two Workers and mocks an upstream API:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;tests/vitest.test.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { afterAll, afterEach, beforeAll, test } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;vitest&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { http, HttpResponse } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;msw&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { setupServer } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;msw/node&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createTestHarness } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;wrangler&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; network&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; setupServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; server&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createTestHarness&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	workers: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		/** Includes `&quot;routes&quot;: [&quot;example.com/*&quot;]` */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{ configPath: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./workers/web/wrangler.jsonc&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		/** Includes `&quot;routes&quot;: [&quot;api.example.com/v1/*&quot;]` */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{ configPath: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./workers/api/wrangler.jsonc&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;beforeAll&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	network.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;listen&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ onUnhandledRequest: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; server.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;listen&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;afterEach&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	network.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resetHandlers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; server.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;reset&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;afterAll&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	network.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; server.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;routes requests to each Worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Mock the outbound fetch used to load user profiles.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	network.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		http.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;http://identity.example.com/profile/123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; HttpResponse.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ id: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;123&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Ada&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; apiWorkerResponse&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; server.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;		&quot;http://api.example.com/v1/users/123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	expect&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; apiWorkerResponse.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;()).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toEqual&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		id: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;123&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Ada&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; webWorkerResponse&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; server.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;http://example.com/users/123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	expect&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; webWorkerResponse.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;()).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Profile: Ada&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;tests/vitest.test.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { afterAll, afterEach, beforeAll, test } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;vitest&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { http, HttpResponse } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;msw&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { setupServer } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;msw/node&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createTestHarness } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;wrangler&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; network&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; setupServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; server&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createTestHarness&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	workers: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		/** Includes `&quot;routes&quot;: [&quot;example.com/*&quot;]` */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{ configPath: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./workers/web/wrangler.jsonc&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		/** Includes `&quot;routes&quot;: [&quot;api.example.com/v1/*&quot;]` */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{ configPath: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./workers/api/wrangler.jsonc&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;beforeAll&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	network.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;listen&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ onUnhandledRequest: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; server.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;listen&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;afterEach&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	network.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resetHandlers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; server.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;reset&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;afterAll&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	network.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; server.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;routes requests to each Worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;expect&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Mock the outbound fetch used to load user profiles.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	network.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		http.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;http://identity.example.com/profile/123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; HttpResponse.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ id: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;123&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Ada&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; apiWorkerResponse&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; server.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;		&quot;http://api.example.com/v1/users/123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	expect&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; apiWorkerResponse.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;()).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toEqual&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		id: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;123&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Ada&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; webWorkerResponse&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; server.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;http://example.com/users/123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	expect&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; webWorkerResponse.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;()).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Profile: Ada&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;Cloudflare now recommends &lt;code&gt;createTestHarness()&lt;/code&gt; for integration tests instead of &lt;a href=&quot;https://developers.cloudflare.com/workers/testing/unstable_startworker/&quot;&gt;&lt;code&gt;unstable_startWorker()&lt;/code&gt;&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/api/#unstable_dev&quot;&gt;&lt;code&gt;unstable_dev()&lt;/code&gt;&lt;/a&gt;. To start a development server programmatically, use the Vite &lt;a href=&quot;https://vite.dev/guide/api-javascript.html#createserver&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;createServer()&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; API with the &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/&quot;&gt;Cloudflare Vite plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information about &lt;code&gt;createTestHarness()&lt;/code&gt;, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/testing/test-harness/&quot;&gt;Integration test harness guide&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>R2 - Sippy now supports Azure Blob Storage and S3-compatible storage providers</title><link>https://developers.cloudflare.com/changelog/post/2026-07-24-r2-sippy-azure-s3-compatible-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-24-r2-sippy-azure-s3-compatible-support/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2/data-migration/sippy/&quot;&gt;Sippy&lt;/a&gt; can now incrementally migrate data from Azure Blob Storage and any S3-compatible object storage provider to &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;Cloudflare R2&lt;/a&gt;, 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;enable-sippy&quot;&gt;Enable Sippy&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#enable-sippy&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Run the following command and follow the prompts to select and configure your source storage provider:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; bucket&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sippy&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; enable&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;BUCKET_NAM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=400,height=650,format=webp/_astro/sippy-azure-source-configuration.j9uacYgX.png&quot; alt=&quot;Azure Blob Storage source configuration in the R2 dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;400&quot; height=&quot;650&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For setup instructions and credential requirements, refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2/data-migration/sippy/&quot;&gt;Sippy documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>Workers - Workers Builds now skips superseded queued builds</title><link>https://developers.cloudflare.com/changelog/post/2026-07-24-skip-superseded-builds/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-24-skip-superseded-builds/</guid><description>&lt;p&gt;Workers Builds now automatically skips a queued build when a newer build for the same build trigger is also queued.&lt;/p&gt;</description><pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Agents - Agents SDK packages support AI SDK v6 and v7</title><link>https://developers.cloudflare.com/changelog/post/2026-07-23-ai-sdk-v6-v7-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-23-ai-sdk-v6-v7-support/</guid><description>
&lt;p&gt;The &lt;code&gt;agents&lt;/code&gt;, &lt;code&gt;@cloudflare/ai-chat&lt;/code&gt;, &lt;code&gt;@cloudflare/codemode&lt;/code&gt;, and &lt;code&gt;@cloudflare/think&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;The supported peer ranges are &lt;code&gt;ai@^6 || ^7&lt;/code&gt; and &lt;code&gt;@ai-sdk/react@^3 || ^4&lt;/code&gt;. Use matching major versions: pair AI SDK v6 with &lt;code&gt;@ai-sdk/react&lt;/code&gt; v3, or pair AI SDK v7 with &lt;code&gt;@ai-sdk/react&lt;/code&gt; v4.&lt;/p&gt;
&lt;p&gt;To install the latest packages with AI SDK v7:&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-npm&quot; id=&quot;pm-tab-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-npm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-yarn&quot; id=&quot;pm-tab-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-yarn&quot; data-nb-pm-tab class=&quot;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&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-pnpm&quot; id=&quot;pm-tab-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-pnpm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-bun&quot; id=&quot;pm-tab-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-bun&quot; data-nb-pm-tab class=&quot;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&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-npm&quot; aria-labelledby=&quot;pm-tab-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-yarn&quot; aria-labelledby=&quot;pm-tab-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-bun&quot; aria-labelledby=&quot;pm-tab-pm-7a7de238-4700-4278-a63f-2b8448b3f3a8-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add agents@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/think@latest ai@^7 @ai-sdk/react@^4&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For setup and usage details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/agents/harnesses/think/&quot;&gt;Think documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category></item><item><title>Agents, Workers - Agents SDK reduces MCP schema conversion, adds exposure controls for MCP in Think and Code Mode SDK adds direct host APIs</title><link>https://developers.cloudflare.com/changelog/post/2026-07-22-mcp-codemode-updates/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-22-mcp-codemode-updates/</guid><description>
&lt;p&gt;This release reduces repeated MCP schema conversion and adds an opt-out for Think&apos;s automatic MCP tool exposure. It also lets non-AI-SDK hosts invoke the durable Code Mode runtime directly.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;control-direct-mcp-tool-exposure-in-think&quot;&gt;Control direct MCP tool exposure in Think&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#control-direct-mcp-tool-exposure-in-think&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/think&lt;/code&gt; also adds &lt;code&gt;includeMcpTools&lt;/code&gt;. Set it to &lt;code&gt;false&lt;/code&gt; when you expose MCP tools through Code Mode or another mechanism outside Think&apos;s automatic tool set:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	includeMcpTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	waitForMcpConnections&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	includeMcpTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	waitForMcpConnections&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;This setting skips Think&apos;s automatic &lt;code&gt;getAITools()&lt;/code&gt; call. MCP registration, restoration, discovery, raw catalog access, direct calls, and Code Mode connectors continue to work.&lt;/p&gt;
&lt;p&gt;Use &lt;a href=&quot;https://developers.cloudflare.com/agents/model-context-protocol/apis/client-api/#thismcplisttools&quot;&gt;&lt;code&gt;listTools()&lt;/code&gt;&lt;/a&gt; when you only need the raw MCP catalog. For connector setup, refer to &lt;a href=&quot;https://developers.cloudflare.com/agents/tools/codemode/mcp/&quot;&gt;Use MCP tools with Code Mode&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;invoke-the-code-mode-runtime-without-the-ai-sdk&quot;&gt;Invoke the Code Mode runtime without the AI SDK&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#invoke-the-code-mode-runtime-without-the-ai-sdk&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/codemode@latest&lt;/code&gt; adds &lt;code&gt;execute()&lt;/code&gt;, &lt;code&gt;search()&lt;/code&gt;, and &lt;code&gt;describe()&lt;/code&gt; 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.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; matches&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;create issue&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; docs&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(matches.results[&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;].path);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; outcome&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	code: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`async () =&gt; github.create_issue({ title: &quot;Bug&quot; })`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; matches&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;create issue&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; docs&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(matches.results[&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;].path);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; outcome&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;execute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	code: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`async () =&amp;gt; github.create_issue({ title: &quot;Bug&quot; })`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Search and describe results include &lt;code&gt;requiresApproval: true&lt;/code&gt; for protected connector methods. Resolve a paused execution with the existing &lt;code&gt;approve()&lt;/code&gt; and &lt;code&gt;reject()&lt;/code&gt; methods.&lt;/p&gt;
&lt;p&gt;For setup and exact method types, refer to &lt;a href=&quot;https://developers.cloudflare.com/agents/tools/codemode/durable-runtime/&quot;&gt;Create a durable Code Mode runtime&lt;/a&gt; and the &lt;a href=&quot;https://developers.cloudflare.com/agents/tools/codemode/api-reference/&quot;&gt;Code Mode API reference&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-npm&quot; id=&quot;pm-tab-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-npm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-yarn&quot; id=&quot;pm-tab-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-yarn&quot; data-nb-pm-tab class=&quot;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&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-pnpm&quot; id=&quot;pm-tab-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-pnpm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-bun&quot; id=&quot;pm-tab-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-bun&quot; data-nb-pm-tab class=&quot;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&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-npm&quot; aria-labelledby=&quot;pm-tab-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-yarn&quot; aria-labelledby=&quot;pm-tab-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-bun&quot; aria-labelledby=&quot;pm-tab-pm-251191f7-a767-4c47-a903-ebe5dd1f9020-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Cloudflare One Client - Cloudflare One Client for Windows (version 2026.6.880.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-07-21-warp-windows-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-21-warp-windows-ga/</guid><description>&lt;p&gt;A new GA release for the Windows Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
</description><pubDate>Tue, 21 Jul 2026 16:55:55 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - Cloudflare One Client for macOS (version 2026.6.880.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-07-21-warp-macos-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-21-warp-macos-ga/</guid><description>&lt;p&gt;A new GA release for the macOS Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
</description><pubDate>Tue, 21 Jul 2026 16:55:55 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - Cloudflare One Client for Linux (version 2026.6.880.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-07-21-warp-linux-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-21-warp-linux-ga/</guid><description>&lt;p&gt;A new GA release for the Linux Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
</description><pubDate>Tue, 21 Jul 2026 16:50:41 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare Fundamentals - Account Role API deprecated</title><link>https://developers.cloudflare.com/changelog/post/2026-07-21-account-role-api-deprecated/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-21-account-role-api-deprecated/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/api/resources/accounts/subresources/roles/&quot;&gt;Account Roles API&lt;/a&gt; is deprecated and is being replaced by the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/iam/subresources/permission_groups/&quot;&gt;Permission Groups API&lt;/a&gt;. An end of life date has not yet been established.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-you-need-to-do&quot;&gt;What you need to do&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-you-need-to-do&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Review the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/iam/subresources/permission_groups/&quot;&gt;Permission Groups API&lt;/a&gt; documentation; the response schema differs from the legacy Roles response.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;highlights&quot;&gt;Highlights&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#highlights&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;The legacy &lt;code&gt;Role&lt;/code&gt; response includes a top-level &lt;code&gt;description&lt;/code&gt; and a &lt;code&gt;permissions&lt;/code&gt; object keyed by resource type with edit/read flags.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;PermissionGroup&lt;/code&gt; response replaces those with a &lt;code&gt;meta&lt;/code&gt; object containing &lt;code&gt;label&lt;/code&gt; and &lt;code&gt;scopes&lt;/code&gt;. Individual permissions are not returned as part of the permission group.&lt;/li&gt;
&lt;li&gt;The new API supports the &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/get-started/create-token/&quot;&gt;API Token&lt;/a&gt; authorization scheme. The legacy Email + API Key authorization schema is provided for backwards compatibility.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/reference/deprecations/&quot;&gt;API deprecations&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Sandbox SDK - Run Devin on Cloudflare using Devin Outposts</title><link>https://developers.cloudflare.com/changelog/post/2026-07-21-devin-outposts/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-21-devin-outposts/</guid><description>&lt;p&gt;&lt;a href=&quot;https://docs.devin.ai/onboard-devin/outposts&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Devin Outposts&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; lets you run Devin agents on Cloudflare. Each Devin session runs in its own isolated sandbox backed by &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Cloudflare Containers&lt;/a&gt;, so agents can execute code and use development tooling in an isolated environment.&lt;/p&gt;
&lt;p&gt;Use Devin Outposts when you want Devin sessions to run on Cloudflare managed infrastructure, with each session isolated from the others.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1712,height=914,format=webp/_astro/devin-outposts.B3xjmfR5.jpg&quot; alt=&quot;Devin interface showing Cloudflare selected as an Outposts virtual environment&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1712&quot; height=&quot;914&quot;&gt;
&lt;p&gt;To get started, refer to &lt;a href=&quot;https://developers.cloudflare.com/sandbox/tutorials/devin-outposts/&quot;&gt;Run Devin on Cloudflare using Devin Outposts&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><product>Sandbox SDK</product><category>Sandbox SDK</category></item><item><title>SSL/TLS - Faster and more secure TLS handshakes to your origins, automatically</title><link>https://developers.cloudflare.com/changelog/post/2026-07-21-automatic-origin-key-exchange/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-21-automatic-origin-key-exchange/</guid><description>&lt;p&gt;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 &lt;code&gt;ClientHello&lt;/code&gt;, helping avoid a &lt;code&gt;HelloRetryRequest&lt;/code&gt; and one extra network round trip.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;X25519MLKEM768&lt;/code&gt; hybrid key agreement.&lt;/p&gt;
&lt;p&gt;To change this behavior, go to &lt;strong&gt;SSL/TLS&lt;/strong&gt; &amp;gt; &lt;strong&gt;Overview&lt;/strong&gt; &amp;gt; &lt;strong&gt;Origin connection &amp;amp; post-quantum encryption&lt;/strong&gt;. Turn off &lt;strong&gt;Automatic key exchange&lt;/strong&gt; to stop automatic scans and preference updates. Turning it off does not change your compliance requirements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compliance requirements&lt;/strong&gt; apply only to TLS 1.3 connections. The &lt;strong&gt;Post-quantum hybrid&lt;/strong&gt; option requires hybrid post-quantum key agreements support on your origin server. The &lt;strong&gt;Federal Information Processing Standards (FIPS)&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;For requirements, configuration options, and rollout details, refer to &lt;a href=&quot;https://developers.cloudflare.com/ssl/origin-configuration/automatic-key-exchange/&quot;&gt;Automatic key exchange to origins&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><product>SSL/TLS</product><category>SSL/TLS</category></item><item><title>WAF - WAF Release - 2026-07-21</title><link>https://developers.cloudflare.com/changelog/post/2026-07-21-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-21-waf-release/</guid><description>
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WAF and framework adapter mitigations for Next.js vulnerabilities&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Multiple &lt;a href=&quot;https://nextjs.org/blog/july-2026-security-release&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;security vulnerabilities&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Advisory&lt;/th&gt;&lt;th&gt;CVE&lt;/th&gt;&lt;th&gt;Severity&lt;/th&gt;&lt;th&gt;Issue&lt;/th&gt;&lt;th&gt;WAF Coverage&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-m99w-x7hq-7vfj&quot;&gt;Denial of Service in App Router using Server Actions&lt;/a&gt;&lt;/td&gt;&lt;td&gt;CVE-2026-64641&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;td&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;WAF rule Next.js - DoS - CVE-2026-64641 (&lt;rule-id id=&quot;b013b67c357547b4b866234390dcdb0a&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...90dcdb0a&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;) has been deployed to provide coverage.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-6gpp-xcg3-4w24&quot;&gt;Middleware / Proxy bypass in App Router applications using Turbopack and single locale&lt;/a&gt;&lt;/td&gt;&lt;td&gt;CVE-2026-64642&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;td&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a middleware bypass that unfortunately cannot be covered through Cloudflare WAF signature engine.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-p9j2-gv94-2wf4&quot;&gt;Server-Side Request Forgery in rewrites via attacker-controlled destination hostname&lt;/a&gt;&lt;/td&gt;&lt;td&gt;CVE-2026-64645&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;td&gt;&lt;p&gt;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&apos;s hostname suffix. For rewrites, this behavior enables Server-Side Request Forgery (SSRF); for redirects, Open Redirect can be achieved.&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Existing SSRF rules provide adequate coverage for this vulnerability, no tailored WAF rule was developed.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-89xv-2m56-2m9x&quot;&gt;Server-Side Request Forgery in Server Actions on custom servers&lt;/a&gt;&lt;/td&gt;&lt;td&gt;CVE-2026-64649&lt;/td&gt;&lt;td&gt;High&lt;/td&gt;&lt;td&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;WAF rule Next.js - SSRF - CVE-2026-64649 (&lt;rule-id id=&quot;7fe6d6f3df774ae2a0011f20930091a3&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...930091a3&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;) has been deployed to provide coverage.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-q8wf-6r8g-63ch&quot;&gt;Denial of Service in the Image Optimization API using SVGs&lt;/a&gt;&lt;/td&gt;&lt;td&gt;CVE-2026-64644&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;Malicious request is unfortunately indistinguishable from a legitimate image optimization request, so no WAF rule has been created to address this vulnerability.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-4c39-4ccg-62r3&quot;&gt;Unbounded Server Action payload in Edge runtime&lt;/a&gt;&lt;/td&gt;&lt;td&gt;CVE-2026-64646&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-955p-x3mx-jcvp&quot;&gt;Unauthenticated disclosure of internal Server Function endpoints&lt;/a&gt;&lt;/td&gt;&lt;td&gt;CVE-2026-64643&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;WAF rule Next.js - Information Disclosure - CVE-2026-64643 (&lt;rule-id id=&quot;6c4135d4d9d745e4866ad83672952826&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...72952826&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;) has been deployed to provide coverage.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-68g3-v927-f742&quot;&gt;Cache confusion of response bodies for requests with bodies&lt;/a&gt;&lt;/td&gt;&lt;td&gt;CVE-2026-64648&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;&lt;p&gt;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)&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is an application logic bug that unfortunately cannot be covered through Cloudflare WAF signature engine.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-4633-3j49-mh5q&quot;&gt;Cache confusion of response bodies for requests with bodies containing invalid UTF-8 byte sequences&lt;/a&gt;&lt;/td&gt;&lt;td&gt;CVE-2026-64647&lt;/td&gt;&lt;td&gt;Medium&lt;/td&gt;&lt;td&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is an application logic bug that unfortunately cannot be covered through Cloudflare WAF signature engine.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;7fbdc9407bdb4a4eae2b3d91215e7d31&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...215e7d31&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSRF - Restricted Protocol&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;6ca512d240d848d6a0c7ef42a935ee5d&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...a935ee5d&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSRF - Obfuscated Host&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;a3fb0870c38440d8a9a0eba81b0230ac&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1b0230ac&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;LFI - Path Traversal&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;452a04be3f73458c863d8dae61349c8b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...61349c8b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Adobe ColdFusion - File Upload Path Traversal - CVE:CVE-2026-48276&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;a53a3fb491c64d74908081ee9cb61eac&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...9cb61eac&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Adobe ColdFusion - Path Traversal - CVE:CVE-2026-48282&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;d8b63828c2344d919b94d2594ac5e21f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...4ac5e21f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XSS — JS Bracket Concat Obfuscation - Body&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;264a83a764be428ca41d516ff31f5559&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...f31f5559&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XSS — JS Bracket Concat Obfuscation - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;4ba21a60837244029183b782987984fd&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...987984fd&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XSS — JS Bracket Concat Obfuscation - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;1c060d3a371549219ee290d7ed933fcc&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ed933fcc&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Wordpress - SQL Injection - CVE:CVE-2026-60137&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This was labeled as Generic Rules - SQLi.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;7dfb2bd4708d4b88b9911dc0550664b6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...550664b6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Wordpress - Remote Code Execution - CVE:CVE-2026-63030&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This was labeled as Generic Rules - Unauthenticated RCE.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Free Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;db003b39b7774859a8d588ce33697a1a&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...33697a1a&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Wordpress - SQL Injection - CVE:CVE-2026-60137&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This was labeled as Generic Rules - SQLi.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Free Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ebd3f2df15c74ddcbf6220c9b5ec246a&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...b5ec246a&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Wordpress - Remote Code Execution - CVE:CVE-2026-63030&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This was labeled as Generic Rules - Unauthenticated RCE.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;6c4135d4d9d745e4866ad83672952826&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...72952826&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Next.js - Information Disclosure - CVE-2026-64643&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This was labeled as Generic Rules - Information Disclosure.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;7fe6d6f3df774ae2a0011f20930091a3&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...930091a3&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Next.js - SSRF - CVE-2026-64649&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This was labeled as Generic Rules - Auth Bypass - 2.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;c4ca56c0a6a348299d5a93e663167195&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...63167195&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Next.js - Remote Code Execution - Cache Components&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This was labeled as Generic Rules - RCE.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;b013b67c357547b4b866234390dcdb0a&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...90dcdb0a&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Next.js - DoS - CVE-2026-64641&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This was labeled as Generic Rules - DoS.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;aa21c9b8b97743bfb217748b2049a60c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...2049a60c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Command Execution - Body - Beta&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt; - &lt;/td&gt;&lt;td&gt;&lt;p&gt;This detection has been removed.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;e7ee67e824844754b513cdf3836855a4&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...836855a4&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Command Execution - Header - Beta&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt; - &lt;/td&gt;&lt;td&gt;&lt;p&gt;This detection has been removed.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;5f2a6681a2b94442b23816286d060a0d&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...6d060a0d&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Command Execution - URI - Beta&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt; - &lt;/td&gt;&lt;td&gt;&lt;p&gt;This detection has been removed.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Access - Browser-based login for plaintext HTTP private applications</title><link>https://developers.cloudflare.com/changelog/post/2026-07-20-http-private-apps-l7-auth/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-20-http-private-apps-l7-auth/</guid><description>&lt;p&gt;Cloudflare Access now uses the standard browser-based login flow for &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/self-hosted-private-app/&quot;&gt;private applications&lt;/a&gt; served over plaintext HTTP on port &lt;code&gt;80&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Previously, plaintext HTTP private apps fell back to the same session flow used for SSH, RDP, and other non-HTTP protocols: users got an &lt;code&gt;Authentication required&lt;/code&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/authorization-cookie/application-token/&quot;&gt;application token&lt;/a&gt; on success.&lt;/p&gt;
&lt;p&gt;This brings the HTTP experience in line with HTTPS apps (with &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/tls-decryption/&quot;&gt;Gateway TLS decryption&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Other non-HTTP protocols (SSH, RDP, arbitrary TCP/UDP) continue to use the Cloudflare One Client notification flow.&lt;/p&gt;</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Billing, Workers - Budget alerts now on by default for Pay-as-you-go accounts</title><link>https://developers.cloudflare.com/changelog/post/2026-06-15-budget-alerts-default-on/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-15-budget-alerts-default-on/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;We are rolling this out in cohorts over the coming weeks, so eligible accounts may see their default alert appear at different times.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Usage is processed once per day for the prior day&apos;s activity, so budget alerts fire the day after the threshold is reached rather than in real time.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;You can change the threshold, add additional alerts, or remove the default alert entirely from &lt;strong&gt;Manage Account&lt;/strong&gt; &amp;gt; &lt;strong&gt;Billing&lt;/strong&gt; &amp;gt; &lt;strong&gt;Billable Usage&lt;/strong&gt;, or from your Notifications settings. If you already configured your own budget alert, nothing changes.&lt;/p&gt;
&lt;p&gt;Enterprise contract accounts are not in scope.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/billing/manage/budget-alerts/&quot;&gt;Budget alerts documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><product>Billing</product><category>Billing</category><category>Workers</category></item><item><title>Durable Objects, Workers - View total SQLite storage for Durable Object namespaces</title><link>https://developers.cloudflare.com/changelog/post/2026-07-20-durable-objects-total-storage-metrics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-20-durable-objects-total-storage-metrics/</guid><description>
&lt;p&gt;You can now monitor the total SQLite storage used by a Durable Object namespace over time in the Cloudflare dashboard. The new &lt;strong&gt;Total storage&lt;/strong&gt; chart shows the maximum storage reported during each hour. This helps you identify storage growth, validate data cleanup, and investigate unexpected usage.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1436,height=846,format=webp/_astro/durable-objects-total-storage.Cr_F72Yz.png&quot; alt=&quot;The Total storage chart showing a Durable Object namespace growing to 260.1 MB of storage over time.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1436&quot; height=&quot;846&quot;&gt;&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/durable-objects&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Durable Objects&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/observability/metrics-and-analytics/#total-storage&quot;&gt;Metrics and analytics&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Cloudflare One Appliance, Cloudflare One, Cloudflare WAN - Restart, reboot, or shut down a Cloudflare One Appliance from the dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-07-17-appliance-restart-reboot-shutdown/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-17-appliance-restart-reboot-shutdown/</guid><description>&lt;p&gt;You can now restart, reboot, or shut down a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/&quot;&gt;Cloudflare One Appliance&lt;/a&gt; directly from the dashboard or via API.&lt;/p&gt;
&lt;img src=&quot;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&quot; alt=&quot;Restarting a Cloudflare One Appliance from the Operations section of the Edit Appliance page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1800&quot; height=&quot;948&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Restart&lt;/strong&gt; — Restart managed services. Purges temporary and (optionally) persistent state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reboot&lt;/strong&gt; — Power cycle the appliance. Optionally, purge persistent state. Re-applies configuration starting from scratch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shutdown&lt;/strong&gt; — Power off the appliance. Optionally, purge persistent state. The machine will be offline until manually powered on again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the dashboard, go to &lt;strong&gt;Networking&lt;/strong&gt; &amp;gt; &lt;strong&gt;Connectors&lt;/strong&gt; &amp;gt; &lt;strong&gt;Appliances&lt;/strong&gt;, select an appliance, then &lt;strong&gt;Edit&lt;/strong&gt; &amp;gt; &lt;strong&gt;Operations&lt;/strong&gt; to send an operation. Via API, &lt;code&gt;POST&lt;/code&gt; to the &lt;code&gt;/accounts/{account_id}/magic/connectors/{connector_id}/interrupts&lt;/code&gt; endpoint.&lt;/p&gt;
&lt;p&gt;For details, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/maintenance/appliance-operations/&quot;&gt;Appliance operations&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><product>Cloudflare One Appliance</product><category>Cloudflare One Appliance</category><category>Cloudflare One</category><category>Cloudflare WAN</category></item><item><title>Email Service - Preview sent emails in the Activity log</title><link>https://developers.cloudflare.com/changelog/post/2026-07-17-email-message-preview/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-17-email-message-preview/</guid><description>&lt;p&gt;You can now preview the content of sent emails directly from the Email Service Activity log. Expand a sent email and open the new &lt;strong&gt;Preview&lt;/strong&gt; section to inspect the message as it was sent, across tabs for the rendered &lt;strong&gt;HTML&lt;/strong&gt; body, the &lt;strong&gt;Text&lt;/strong&gt; body, the &lt;strong&gt;Headers&lt;/strong&gt;, the &lt;strong&gt;Attachments&lt;/strong&gt;, and the full &lt;strong&gt;Raw&lt;/strong&gt; &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc5322&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 5322&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; source.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2864,height=1172,format=webp/_astro/email-message-preview.Bj6Lk8Y6.png&quot; alt=&quot;The rendered HTML preview of a sent email in the Email Service Activity log&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2864&quot; height=&quot;1172&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To make messages previewable, turn on &lt;strong&gt;Email preview&lt;/strong&gt; in your sending domain&apos;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 &lt;strong&gt;Email preview&lt;/strong&gt; turned on automatically.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2256,height=264,format=webp/_astro/email-preview-setting.XEd1WIiO.png&quot; alt=&quot;The Email preview setting in a sending domain&apos;s settings&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2256&quot; height=&quot;264&quot;&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/email-service/observability/logs/#message-preview&quot;&gt;Email logs&lt;/a&gt; for more information.&lt;/p&gt;</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><product>Email Service</product><category>Email Service</category></item><item><title>Gateway - New header control options for Gateway HTTP policies</title><link>https://developers.cloudflare.com/changelog/post/2026-07-17-http-request-header-manipulation/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-17-http-request-header-manipulation/</guid><description>&lt;p&gt;Cloudflare Gateway now supports advanced header control on &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/#allow&quot;&gt;Allow policies&lt;/a&gt;. Administrators can add, overwrite, or delete headers on matching requests using static values or dynamic variables.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;header-operations&quot;&gt;Header operations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#header-operations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Gateway HTTP policies using the Allow action support three operations in &lt;code&gt;rule_settings&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;API field&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Add&lt;/td&gt;
&lt;td&gt;&lt;code&gt;add_headers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Appends a value to the header. Existing values are preserved.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overwrite&lt;/td&gt;
&lt;td&gt;&lt;code&gt;set_headers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Replaces the header value. Creates the header if it does not exist.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete&lt;/td&gt;
&lt;td&gt;&lt;code&gt;delete_headers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Removes the header from the request.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Gateway applies operations in order: delete, then overwrite, then add.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;dynamic-variables&quot;&gt;Dynamic variables&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#dynamic-variables&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Header values can include dynamic variables using the &lt;code&gt;@{...}&lt;/code&gt; syntax. Gateway resolves variables at request time from identity, device, and network context.&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@{identity.email}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User email from the identity provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@{identity.name}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User display name from the identity provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@{identity.id}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cloudflare identity UUID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@{identity.groups}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Identity provider group memberships&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@{identity.SAML}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SAML attributes (if configured)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@{identity.OIDC}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OIDC claims (if configured)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@{source.ip}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Source IP of the connection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@{destination.ip}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Destination IP of the request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@{device.id}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cloudflare One Client device UUID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@{device.posture}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Device posture check results (JSON string)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;You can mix static text and dynamic variables in a single header value. For example, &lt;code&gt;user-@{identity.email}&lt;/code&gt; resolves to &lt;code&gt;user-jdoe@example.com&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/tenant-control/&quot;&gt;Custom headers&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category></item><item><title>Cloudflare Fundamentals, Organizations - Distributor, MSSP, and Agency partners can manage Organization members directly</title><link>https://developers.cloudflare.com/changelog/post/2026-07-17-distributor-mssp-self-serve-members/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-17-distributor-mssp-self-serve-members/</guid><description>&lt;p&gt;Distributor, MSSP, and Agency partners on Cloudflare &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/organizations/&quot;&gt;Organizations&lt;/a&gt; can now add and manage Organization Members directly from the Cloudflare dashboard, without help from Cloudflare.&lt;/p&gt;
&lt;p&gt;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 &lt;strong&gt;Add member&lt;/strong&gt; flow was blocked for these Organizations.&lt;/p&gt;
&lt;p&gt;Now, Organization admins can add members themselves from &lt;strong&gt;Organization&lt;/strong&gt; &amp;gt; &lt;strong&gt;Members&lt;/strong&gt; &amp;gt; &lt;strong&gt;Add member&lt;/strong&gt;, with no beta enrollment required.&lt;/p&gt;
&lt;p&gt;New members receive access to the Organization&apos;s accounts through the same implicit-access model already used for enterprise Organizations. The &lt;strong&gt;Accounts&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;Agency partners also gain access to the Organizations dashboard, while retaining access to their existing Tenant management dashboard.&lt;/p&gt;
&lt;p&gt;Distributor, MSSP, and Agency Organizations are currently in beta.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/organizations/manage-members/&quot;&gt;Manage Organization members&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>Organizations</category></item><item><title>WAF - WAF Release - 2026-07-17 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2026-07-17-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-17-emergency-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generic Frameworks - SQLi: Attackers can execute unauthorized database queries due to a failure to sanitize input values within request parameters.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;7dfb2bd4708d4b88b9911dc0550664b6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...550664b6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Unauthenticated RCE&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;1c060d3a371549219ee290d7ed933fcc&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ed933fcc&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - SQLi &lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Free Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ebd3f2df15c74ddcbf6220c9b5ec246a&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...b5ec246a&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Unauthenticated RCE &lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Free Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;db003b39b7774859a8d588ce33697a1a&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...33697a1a&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - SQLi &lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Access, Cloudflare One - Bulk print PDFs for browser-based RDP</title><link>https://developers.cloudflare.com/changelog/post/2026-07-16-rdp-bulk-print/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-16-rdp-bulk-print/</guid><description>&lt;p&gt;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 &lt;strong&gt;Print all PDFs&lt;/strong&gt; in the clipboard panel. The files are combined into one PDF and sent to your local printer.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=768,height=432,format=webp/_astro/rdp-bulk-print.DT4sCcI-.png&quot; alt=&quot;The clipboard panel showing the Print all PDFs option for multiple selected PDF files.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;768&quot; height=&quot;432&quot;&gt;
&lt;p&gt;Bulk print is available in Chromium-based browsers and Firefox. For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/rdp/rdp-browser/#print-pdfs&quot;&gt;Print PDFs for browser-based RDP&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category><category>Cloudflare One</category></item><item><title>Flagship - Manage Flagship from the command line with Wrangler</title><link>https://developers.cloudflare.com/changelog/post/2026-07-16-wrangler-commands/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-16-wrangler-commands/</guid><description>&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt;&lt;/strong&gt; now includes &lt;code&gt;wrangler flagship&lt;/code&gt;, a command suite for managing &lt;a href=&quot;https://developers.cloudflare.com/flagship/&quot;&gt;Flagship&lt;/a&gt; apps and feature flags from your terminal.&lt;/p&gt;
&lt;p&gt;Create an app and, if you use it from a Worker, add it to your &lt;code&gt;wrangler.json&lt;/code&gt; or &lt;code&gt;wrangler.jsonc&lt;/code&gt; file as a binding:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; apps&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;My Worker App&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --binding&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; FLAGS&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --update-config&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Then create flags for the behavior you want to control. Flags can be booleans, strings, numbers, or JSON values:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; new-checkout&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; checkout-flow&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --variation&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; control=old-checkout&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --variation&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; treatment=new-checkout&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --default&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; control&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --type&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; string&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; update&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; checkout-flow&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --default&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; treatment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; disable&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; checkout-flow&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; enable&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; checkout-flow&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For release workflows, use &lt;code&gt;rollout&lt;/code&gt;, &lt;code&gt;split&lt;/code&gt;, and &lt;code&gt;rules&lt;/code&gt; to change exposure without redeploying your Worker:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; rollout&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; new-checkout&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --to&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; on&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --percentage&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 25&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --by&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; user_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; split&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; checkout-flow&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --weight&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; control=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;80&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --weight&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; treatment=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --by&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; user_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flagship&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; rules&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; update&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APP_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; checkout-flow&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --priority&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --when&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;country equals US&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/flagship/reference/wrangler-commands/&quot;&gt;&lt;code&gt;wrangler flagship&lt;/code&gt; command reference&lt;/a&gt; for the full command guide.&lt;/p&gt;</description><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><product>Flagship</product><category>Flagship</category></item><item><title>Rules - Bot management fields and ASN support in Cache Rules</title><link>https://developers.cloudflare.com/changelog/post/2026-07-16-cache-rules-bot-fields-asn/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-16-cache-rules-bot-fields-asn/</guid><description>&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;bot-management-fields-and-asn-support-in-cache-rules&quot;&gt;Bot management fields and ASN support in Cache Rules&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bot-management-fields-and-asn-support-in-cache-rules&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Cache Rules now supports bot management fields and the &lt;code&gt;ip.src.asnum&lt;/code&gt; 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).&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-fields&quot;&gt;New fields&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-fields&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The following fields are now available in Cache Rules expressions:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.bot_management.score&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Bot score from &lt;code&gt;1&lt;/code&gt; to &lt;code&gt;99&lt;/code&gt;, where a lower value indicates a higher likelihood that the request originates from a bot.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.bot_management.ja3_hash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;JA3 fingerprint of the request, which helps identify the client making the connection.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.bot_management.ja4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;JA4 fingerprint of the request, which provides a more detailed client identification than JA3.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.bot_management.verified_bot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;Whether the request originates from a verified bot, such as a search engine crawler.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.bot_management.static_resource&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;Whether the request is for a static resource and therefore exempt from bot detection.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.bot_management.js_detection.passed&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;Whether the browser passed JavaScript detection when the feature is enabled.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.bot_management.attack_score&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Classifies the request by attack score, from &lt;code&gt;1&lt;/code&gt; (likely automated) to &lt;code&gt;99&lt;/code&gt; (likely human).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.bot_management.api_score&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;Classifies the request by API score, from &lt;code&gt;1&lt;/code&gt; (likely automated) to &lt;code&gt;99&lt;/code&gt; (likely human).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.bot_management.bot_tags[&quot;&amp;lt;TAG&amp;gt;&quot;]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;Whether the bot traffic matches the specified tag, such as &lt;code&gt;google&lt;/code&gt; or &lt;code&gt;bing&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.bot_management.corporate_proxy&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;Whether the request originates from a known corporate proxy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ip.src.asnum&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;The autonomous system number (ASN) of the incoming request&apos;s IP address.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;Bot management fields require a Bot Management subscription. &lt;code&gt;ip.src.asnum&lt;/code&gt; is available on all plans.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example&quot;&gt;Example&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;(http.request.uri.path contains &quot;/api/&quot; and cf.bot_management.score lt 30)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;or&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;(http.request.uri.path contains &quot;/api/&quot; and not ip.src.asnum in {12345 67890})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To learn more, refer to the &lt;a href=&quot;https://developers.cloudflare.com/cache/how-to/cache-rules/&quot;&gt;Cache Rules documentation&lt;/a&gt; and the &lt;a href=&quot;https://developers.cloudflare.com/ruleset-engine/rules-language/fields/&quot;&gt;Fields reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><product>Rules</product><category>Rules</category></item><item><title>Gateway, DNS - Internal DNS is now generally available</title><link>https://developers.cloudflare.com/changelog/post/2026-07-15-internal-dns-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-15-internal-dns-ga/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/dns/internal-dns/&quot;&gt;Internal DNS&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;why-it-matters&quot;&gt;Why it matters&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#why-it-matters&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Consolidate DNS operations.&lt;/strong&gt; Public and private DNS run on one platform, with one API, one audit trail, and one place to set policy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplify split-horizon DNS.&lt;/strong&gt; Internal and external resolution are defined as separate &lt;a href=&quot;https://developers.cloudflare.com/dns/internal-dns/dns-views/&quot;&gt;views&lt;/a&gt; over shared zones, managed from a single control plane — so there is no drift to chase down.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extend Zero Trust to DNS.&lt;/strong&gt; Resolver policies decide which users and devices resolve against which view, enforced by the same &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot;&gt;Gateway&lt;/a&gt; that already governs the rest of your traffic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Setting up Internal DNS takes three steps: create a zone, create a view, and define a resolver policy.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;POST /zones&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;account&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;lt;ACCOUNT_ID&amp;gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;corp.internal&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;internal&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Internal DNS is included with &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot;&gt;Cloudflare Gateway&lt;/a&gt; for Enterprise customers. To get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/dns/internal-dns/&quot;&gt;Internal DNS documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category><category>DNS</category></item><item><title>Email Service, Queues - Subscribe to Email Sending events with Queues</title><link>https://developers.cloudflare.com/changelog/post/2026-07-15-event-subscriptions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-15-event-subscriptions/</guid><description>&lt;p&gt;You can now subscribe to &lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/email-service/api/send-emails/&quot;&gt;Email Sending&lt;/a&gt; events&lt;/strong&gt; through &lt;a href=&quot;https://developers.cloudflare.com/queues/event-subscriptions/&quot;&gt;Queues event subscriptions&lt;/a&gt; and receive outbound transactional email lifecycle events on a queue. Each subscription is scoped to one sending domain — either the zone apex, such as &lt;code&gt;example.com&lt;/code&gt;, or a verified sending subdomain, such as &lt;code&gt;send.example.com&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Six event types are published: &lt;code&gt;message.delivered&lt;/code&gt;, &lt;code&gt;message.deferred&lt;/code&gt;, &lt;code&gt;message.bounced&lt;/code&gt;, &lt;code&gt;message.failed&lt;/code&gt;, &lt;code&gt;message.rejected&lt;/code&gt;, and &lt;code&gt;message.complained&lt;/code&gt;. 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.&lt;/p&gt;
&lt;p&gt;Each event includes the message details, delivery status, and SMTP response:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf.email.sending.message.delivered&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;source&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;email.sending&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;zoneId&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;023e105f4ecef8ad9ca31a8372d0c353&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;domain&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;example.com&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;payload&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;messageId&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;0101018f7d0c4d9a-msg-deadbeef&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;recipient&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user@example.net&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;terminal&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;delivery&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;status&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;delivered&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;smtpStatusCode&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;250&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/email-service/platform/event-subscriptions/&quot;&gt;Event subscriptions&lt;/a&gt; to see all event types and example payloads.&lt;/p&gt;</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><product>Email Service</product><category>Email Service</category><category>Queues</category></item><item><title>KV - Deprecate legacy Workers KV namespace API routes</title><link>https://developers.cloudflare.com/changelog/post/2026-07-15-kv-legacy-namespace-routes-deprecation/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-15-kv-legacy-namespace-routes-deprecation/</guid><description>&lt;p&gt;The legacy Workers KV API routes under &lt;code&gt;/accounts/{account_id}/workers/namespaces/*&lt;/code&gt; are deprecated as of July 15, 2026, and will stop working on October 15, 2026. Migrate to the documented &lt;a href=&quot;https://developers.cloudflare.com/api/resources/kv/&quot;&gt;Workers KV API&lt;/a&gt; routes under &lt;code&gt;/accounts/{account_id}/storage/kv/namespaces/*&lt;/code&gt; before that date.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;/workers/namespaces/&lt;/code&gt; to &lt;code&gt;/storage/kv/namespaces/&lt;/code&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-you-need-to-do&quot;&gt;What you need to do&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-you-need-to-do&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Update any integration that calls a route under &lt;code&gt;/accounts/{account_id}/workers/namespaces/&lt;/code&gt; to use the equivalent route under &lt;code&gt;/accounts/{account_id}/storage/kv/namespaces/&lt;/code&gt;. The migration is a direct URL path substitution — request parameters and response payloads are identical:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET&lt;/code&gt; and &lt;code&gt;POST /accounts/{account_id}/workers/namespaces&lt;/code&gt; → &lt;code&gt;GET&lt;/code&gt; and &lt;code&gt;POST /accounts/{account_id}/storage/kv/namespaces&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, and &lt;code&gt;DELETE /accounts/{account_id}/workers/namespaces/{namespace_id}&lt;/code&gt; → &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, and &lt;code&gt;DELETE /accounts/{account_id}/storage/kv/namespaces/{namespace_id}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /accounts/{account_id}/workers/namespaces/{namespace_id}/keys&lt;/code&gt; → &lt;code&gt;GET /accounts/{account_id}/storage/kv/namespaces/{namespace_id}/keys&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /accounts/{account_id}/workers/namespaces/{namespace_id}/metadata/{key_name}&lt;/code&gt; → &lt;code&gt;GET /accounts/{account_id}/storage/kv/namespaces/{namespace_id}/metadata/{key_name}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, and &lt;code&gt;DELETE /accounts/{account_id}/workers/namespaces/{namespace_id}/values/{key_name}&lt;/code&gt; → &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, and &lt;code&gt;DELETE /accounts/{account_id}/storage/kv/namespaces/{namespace_id}/values/{key_name}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information about the deprecation timeline, refer to &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/reference/deprecations/&quot;&gt;API deprecations&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><product>KV</product><category>KV</category></item><item><title>WAF - WAF Release - 2026-07-14</title><link>https://developers.cloudflare.com/changelog/post/2026-07-14-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-14-waf-release/</guid><description>
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;78826e3223b94da493a2ade876973ac4&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...76973ac4&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Citrix Netscaler ADC - Insufficient Input Validation - CVE:CVE-2026-8451&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;6b64d216620449fbb273d07910233f36&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...10233f36&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Progress Kemp LoadMaster - Remote Code Execution - CVE:CVE-2026-8037&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Cloudflare Web Analytics - Improved reliability for account-wide Web Analytics dashboards</title><link>https://developers.cloudflare.com/changelog/post/2026-06-10-improved-reliability-for-web-analytics-dash/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-10-improved-reliability-for-web-analytics-dash/</guid><description>&lt;p&gt;Cloudflare Web Analytics (Real User Monitoring) has rolled out performance optimizations to significantly improve the stability and loading speed of account-wide dashboards.&lt;/p&gt;
&lt;p&gt;For larger accounts (with &amp;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.&lt;/p&gt;
&lt;p&gt;Accounts with up to 1,000 sites will now be able to load this account-wide aggregate view without experiencing misleading errors.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><product>Cloudflare Web Analytics</product><category>Cloudflare Web Analytics</category></item><item><title>Workers - Platforms can now create Temporary Accounts via the Cloudflare API</title><link>https://developers.cloudflare.com/changelog/post/2026-07-14-temporary-accounts-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-14-temporary-accounts-api/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;With the Temporary Accounts API, coding agents, AI app builders, and other platforms can build a similar flow for generated Workers and supported resources.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1748,height=368,format=webp/_astro/claim-deployments-flow.Co0tUHG4.png&quot; alt=&quot;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&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1748&quot; height=&quot;368&quot;&gt;
&lt;p&gt;The API returns a claim URL that lets the user make the temporary account and its resources permanent.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cloudflare.com/drop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Drop&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;This API expands the flow first introduced with &lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-06-19-temporary-accounts-for-agents/&quot;&gt;&lt;code&gt;wrangler deploy --temporary&lt;/code&gt;&lt;/a&gt;. Your backend now controls the provisioning and deployment experience directly:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Show Cloudflare&apos;s Terms of Service and Privacy Policy in your product, and require the user to accept them.&lt;/li&gt;
&lt;li&gt;Request and solve a proof-of-work challenge.&lt;/li&gt;
&lt;li&gt;Create a temporary preview account.&lt;/li&gt;
&lt;li&gt;Deploy with the returned temporary account ID and API token.&lt;/li&gt;
&lt;li&gt;Show the deployed Worker URL and claim URL to the user.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/provisioning/previews/challenge&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{}&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/provisioning/previews&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;termsOfService&quot;: &quot;https://www.cloudflare.com/terms/&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;privacyPolicy&quot;: &quot;https://www.cloudflare.com/privacypolicy/&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;acceptTermsOfService&quot;: &quot;yes&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;challengeToken&quot;: &quot;&amp;lt;CHALLENGE_TOKEN&amp;gt;&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;solution&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;checkpoints&quot;: &quot;&amp;lt;BASE64_CHECKPOINTS&amp;gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For the complete API flow, proof-of-work requirements, supported products, and limits, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/claim-deployments/#integrate-with-the-rest-api&quot;&gt;Claim deployments (temporary accounts)&lt;/a&gt;. For the background and design goals behind this flow, refer to &lt;a href=&quot;https://blog.cloudflare.com/temporary-accounts/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Temporary Cloudflare Accounts for AI agents&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Agents, Workers - Agents can respond to MCP elicitation requests</title><link>https://developers.cloudflare.com/changelog/post/2026-07-13-mcp-client-elicitation/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-13-mcp-client-elicitation/</guid><description>
&lt;p&gt;Agents connected to Model Context Protocol (MCP) servers with &lt;a href=&quot;https://developers.cloudflare.com/agents/model-context-protocol/apis/client-api/&quot;&gt;&lt;code&gt;addMcpServer&lt;/code&gt;&lt;/a&gt; can now handle &lt;a href=&quot;https://modelcontextprotocol.io/specification/2025-11-25/client/elicitation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;elicitation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; requests.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;pre class=&quot;mermaid&quot;&gt;sequenceDiagram
    participant User
    participant Agent as Agent (MCP client)
    participant Server as MCP server
    participant Browser

    Server-&amp;gt;&amp;gt;Agent: elicitation/create
    Agent-&amp;gt;&amp;gt;User: Show server, reason, and input or URL
    User-&amp;gt;&amp;gt;Agent: Submit, open, decline, or cancel
    Agent-&amp;gt;&amp;gt;Browser: Open URL after consent (URL mode)
    Agent-&amp;gt;&amp;gt;Server: accept, decline, or cancel
    Server--&amp;gt;&amp;gt;Agent: Optional URL completion notification
&lt;/pre&gt;
&lt;p&gt;Register a handler for each mode your Agent supports in &lt;code&gt;onStart()&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Agent } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onStart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.mcp.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;configureElicitationHandlers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			form&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;forwardToUser&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, serverId),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			url&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;forwardToUser&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, serverId),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	forwardToUser&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Show the request in your UI and resolve after the user responds.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		throw&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			`Implement elicitation for ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Agent } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { ElicitRequest, ElicitResult } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/mcp&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onStart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.mcp.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;configureElicitationHandlers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			form&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;forwardToUser&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, serverId),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			url&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;forwardToUser&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, serverId),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	private&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; forwardToUser&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		request&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ElicitRequest&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;ElicitResult&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Show the request in your UI and resolve after the user responds.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		throw&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			`Implement elicitation for ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;serverId&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;params&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;code&gt;onStart()&lt;/code&gt; runs.&lt;/p&gt;
&lt;p&gt;For implementation details and a browser forwarding pattern, refer to &lt;a href=&quot;https://developers.cloudflare.com/agents/model-context-protocol/apis/client-api/#elicitation&quot;&gt;MCP client elicitation&lt;/a&gt;. The &lt;a href=&quot;https://github.com/cloudflare/agents/tree/main/examples/mcp-client&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;mcp-client&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://github.com/cloudflare/agents/tree/main/examples/mcp-elicitation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;mcp-elicitation&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; examples implement both sides.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to this release:&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-npm&quot; id=&quot;pm-tab-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-npm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-yarn&quot; id=&quot;pm-tab-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-yarn&quot; data-nb-pm-tab class=&quot;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&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-pnpm&quot; id=&quot;pm-tab-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-pnpm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-bun&quot; id=&quot;pm-tab-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-bun&quot; data-nb-pm-tab class=&quot;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&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-npm&quot; aria-labelledby=&quot;pm-tab-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i agents@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i agents@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-yarn&quot; aria-labelledby=&quot;pm-tab-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add agents@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add agents@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-bun&quot; aria-labelledby=&quot;pm-tab-pm-34581321-d648-4804-8ab5-3cca6aa7f0a5-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add agents@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Challenges - Precursor introduces session-based bot detection</title><link>https://developers.cloudflare.com/changelog/post/2026-07-13-precursor-session-based-detection/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-13-precursor-session-based-detection/</guid><description>&lt;p&gt;Precursor is rolling out to all customers starting today. Precursor is client-side JavaScript that enables session-based bot detection.&lt;/p&gt;
&lt;p&gt;You can &lt;a href=&quot;https://blog.cloudflare.com/introducing-precursor&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;read the announcement blog&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; for background on why we built Precursor and how session-level behavioral detection works.&lt;/p&gt;
&lt;p&gt;With Precursor enabled, Cloudflare can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Continuously evaluate behavioral signals across a session&lt;/li&gt;
&lt;li&gt;Re-validate challenge clearance as behavior changes&lt;/li&gt;
&lt;li&gt;Update bot scores with session context&lt;/li&gt;
&lt;li&gt;Provide client-side visibility where none previously existed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/images/precursor/enabling_precursor.gif&quot; alt=&quot;Animated walkthrough of enabling Precursor in the Cloudflare dashboard&quot; style=&quot;border:1px solid #e5e7eb;border-radius:6px;display:block;margin:16px 0;&quot;/&gt;
&lt;p&gt;To learn more, refer to the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-challenges/precursor/&quot;&gt;Precursor documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><product>Challenges</product><category>Challenges</category></item><item><title>Cloudflare Fundamentals - Origin Content Signals for Markdown for Agents</title><link>https://developers.cloudflare.com/changelog/post/2026-07-13-markdown-for-agents-header-preservation/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-13-markdown-for-agents-header-preservation/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/&quot;&gt;Markdown for Agents&lt;/a&gt; now preserves security- and cache-relevant response headers from your origin when converting HTML to Markdown:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Markdown for Agents preserves security headers such as &lt;code&gt;Strict-Transport-Security&lt;/code&gt; (HSTS), &lt;code&gt;Content-Security-Policy&lt;/code&gt; (CSP), &lt;code&gt;X-Frame-Options&lt;/code&gt;, &lt;code&gt;Set-Cookie&lt;/code&gt;, and CORS headers (for example, &lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt;) on the converted response.&lt;/li&gt;
&lt;li&gt;Caching headers (&lt;code&gt;Cache-Control&lt;/code&gt;, &lt;code&gt;Expires&lt;/code&gt;, &lt;code&gt;Age&lt;/code&gt;) continue to pass through.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your origin&apos;s &lt;a href=&quot;https://contentsignals.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Content Signals&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; policy is now authoritative. If your origin sets a &lt;code&gt;content-signal&lt;/code&gt; header, Markdown for Agents preserves it. When the origin does not send one, Cloudflare adds the default &lt;code&gt;Content-Signal: ai-train=yes, search=yes, ai-input=yes&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This release also fixes relative link resolution for directory-style base URLs (those ending in a trailing slash). Previously, relative links such as &lt;code&gt;../page/&lt;/code&gt; could resolve one path segment too high and return a &lt;code&gt;404&lt;/code&gt;. Links are now resolved correctly per &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc3986#section-5.2.3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 3986&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Refer to our &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/&quot;&gt;developer documentation&lt;/a&gt; for more details.&lt;/p&gt;</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>R2, R2 Data Catalog - R2 Data Catalog now supports read-only API tokens</title><link>https://developers.cloudflare.com/changelog/post/2026-07-09-r2-data-catalog-read-only-tokens/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-09-r2-data-catalog-read-only-tokens/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; 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 &lt;strong&gt;Admin Read &amp;amp; Write&lt;/strong&gt; token, which granted read-only clients more access than they needed.&lt;/p&gt;
&lt;p&gt;You can now authenticate your Iceberg engine based on your workload:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Read-only&lt;/strong&gt; operations (such as listing namespaces, loading tables, and querying data) work with an &lt;strong&gt;Admin Read only&lt;/strong&gt; token (R2 Data Catalog read and R2 storage read).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write&lt;/strong&gt; operations (such as creating or dropping tables and committing transactions) continue to require an &lt;strong&gt;Admin Read &amp;amp; Write&lt;/strong&gt; token.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/config-examples/duckdb/&quot;&gt;DuckDB&lt;/a&gt;, or &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/config-examples/pyiceberg/&quot;&gt;PyIceberg&lt;/a&gt; that query them.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For details on choosing and creating the right token, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/manage-catalogs/#authenticate-your-iceberg-engine&quot;&gt;Authenticate your Iceberg engine&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category><category>R2 Data Catalog</category></item><item><title>R2 Data Catalog - R2 Data Catalog compaction now optimizes manifest files</title><link>https://developers.cloudflare.com/changelog/post/2026-07-13-r2-data-catalog-manifest-optimization/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-13-r2-data-catalog-manifest-optimization/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;, a managed &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; catalog built into R2, now automatically optimizes manifest files as part of &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/table-maintenance/&quot;&gt;compaction&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;This happens automatically for tables with compaction enabled — no configuration changes are required.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/table-maintenance/&quot;&gt;Table maintenance&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><product>R2 Data Catalog</product><category>R2 Data Catalog</category></item><item><title>Data Loss Prevention - Source code detection improvements</title><link>https://developers.cloudflare.com/changelog/post/2026-07-10-source-code-detection-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-10-source-code-detection-improvements/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Enable and set &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/advanced-settings/#confidence-thresholds&quot;&gt;confidence levels&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Source code detection applies to standalone source code files in &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/&quot;&gt;Gateway HTTP policies&lt;/a&gt;. It does not detect source code embedded within other file types or payloads, such as &lt;code&gt;.docx&lt;/code&gt; files or chat messages.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/predefined-profiles/#source-code&quot;&gt;Source Code predefined profiles&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate><product>Data Loss Prevention</product><category>Data Loss Prevention</category></item><item><title>Workers AI - Plain text output for Markdown Conversion</title><link>https://developers.cloudflare.com/changelog/post/2026-07-13-markdown-conversion-text-output/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-13-markdown-conversion-text-output/</guid><description>
&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/&quot;&gt;Markdown Conversion&lt;/a&gt; service now supports a new &lt;code&gt;output&lt;/code&gt; conversion option that controls the format of the converted content.&lt;/p&gt;
&lt;p&gt;Set &lt;code&gt;output.format&lt;/code&gt; to &lt;code&gt;text&lt;/code&gt; to receive plain text with Markdown syntax removed. The default value is &lt;code&gt;markdown&lt;/code&gt;, so existing conversions are unchanged.&lt;/p&gt;
&lt;p&gt;Use the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/usage/binding/&quot;&gt;&lt;code&gt;env.AI&lt;/code&gt;&lt;/a&gt; binding:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toMarkdown&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;page.html&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, blob: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Blob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;([html]) },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		conversionOptions: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			output: { format: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toMarkdown&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;page.html&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, blob: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Blob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;([html]) },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		conversionOptions: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			output: { format: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;Or call the REST API:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/tomarkdown&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer {API_TOKEN}&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -F&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;files=@index.html&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -F&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;conversionOptions={&quot;output&quot;: {&quot;format&quot;: &quot;text&quot;}}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;When you request text output, the &lt;code&gt;format&lt;/code&gt; field of each result is set to &lt;code&gt;text&lt;/code&gt;. For more details, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/conversion-options/#output&quot;&gt;Conversion Options&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workflows - Workflows now supports delay functions when retrying</title><link>https://developers.cloudflare.com/changelog/post/2026-07-09-dynamic-retry-delays/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-09-dynamic-retry-delays/</guid><description>
&lt;p&gt;With &lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt;, 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 &lt;code&gt;constant&lt;/code&gt;, &lt;code&gt;linear&lt;/code&gt;, or &lt;code&gt;exponential&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Step retries now support dynamic delay functions. Instead of choosing only a base delay and backoff strategy, pass a function to &lt;code&gt;retries.delay&lt;/code&gt; and calculate the next delay from the failed attempt and thrown error.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;Retry-After&lt;/code&gt; value in its error messaging.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;sync customer&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		retries: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			delay&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (error.message.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;rate limit&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;					return&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; `${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;attempt&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 30&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} seconds`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				return&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;10 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; syncCustomer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;sync customer&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		retries: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			delay&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (error.message.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;rate limit&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;					return&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; `${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;attempt&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 30&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} seconds`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				return&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;10 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; syncCustomer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/sleeping-and-retrying/&quot;&gt;Sleeping and retrying&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 09 Jul 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>Digital Experience Monitoring - Wi-Fi signal and network performance analytics for Cloudflare One Client devices</title><link>https://developers.cloudflare.com/changelog/post/2026-07-09-warp-wifi-network-performance-analytics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-09-warp-wifi-network-performance-analytics/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/dex/&quot;&gt;Digital Experience Monitoring (DEX)&lt;/a&gt; provides visibility into device, network, and application performance across your Cloudflare SASE deployment.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Device Monitoring&lt;/strong&gt; page now analyzes hardware and network data between a Cloudflare One Client device and Cloudflare&apos;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1652,height=664,format=webp/_astro/dex-device-monitoring-summary.CBxeSd6b.png&quot; alt=&quot;Device Monitoring summary with connection status, connection mode, Wi-Fi signal strength, traffic performance, and device health&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1652&quot; height=&quot;664&quot;&gt;
&lt;p&gt;A summary at the top of the page shows the health of each category at a glance, using &lt;strong&gt;Good&lt;/strong&gt;, &lt;strong&gt;Fair&lt;/strong&gt;, and &lt;strong&gt;Poor&lt;/strong&gt; labels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Connection&lt;/strong&gt; — connection status, Cloudflare One Client mode, and tunnel type over time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wi-Fi signal strength&lt;/strong&gt; — signal measured in dBm over time, with thresholds that flag a weak signal&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traffic performance&lt;/strong&gt; — upstream and downstream performance, including network throughput on the active interface&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Device health&lt;/strong&gt; — hardware metrics such as CPU, memory, and disk&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1666,height=732,format=webp/_astro/dex-device-monitoring-wifi-network.CoEBznAm.png&quot; alt=&quot;Wi-Fi signal strength and network throughput charts on the Device Monitoring page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1666&quot; height=&quot;732&quot;&gt;
&lt;p&gt;You can filter by category and adjust the time range to correlate a device&apos;s metrics with a user&apos;s reported issue.&lt;/p&gt;
&lt;p&gt;These analytics are available to all Cloudflare One customers at no additional cost.&lt;/p&gt;
&lt;p&gt;To learn more, refer to the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/dex/monitoring/&quot;&gt;DEX monitoring documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate><product>Digital Experience Monitoring</product><category>Digital Experience Monitoring</category></item><item><title>DNS - New DNS Firewall UX with more dashboard settings</title><link>https://developers.cloudflare.com/changelog/post/2026-07-09-new-dns-firewall-ux/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-09-new-dns-firewall-ux/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2694,height=1247,format=webp/_astro/dnsfw-new-ux.vHgdhBZD.png&quot; alt=&quot;New DNS Firewall UX&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2694&quot; height=&quot;1247&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-is-new&quot;&gt;What is new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-is-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;More settings in the dashboard&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better table experience&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New create and edit UX&lt;/strong&gt;: adding and editing clusters now uses a modernized form that groups related settings together, making configuration faster and clearer.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;availability&quot;&gt;Availability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#availability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Available to all DNS Firewall customers as part of their existing subscription.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;where-to-find-it&quot;&gt;Where to find it&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#where-to-find-it&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In the Cloudflare dashboard, go to the &lt;strong&gt;DNS Firewall&lt;/strong&gt; page.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/dns-firewall/clusters&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Clusters&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/dns/dns-firewall/&quot;&gt;DNS Firewall&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate><product>DNS</product><category>DNS</category></item><item><title>Durable Objects, Workers - New Durable Object namespaces must use the SQLite storage backend</title><link>https://developers.cloudflare.com/changelog/post/2026-07-09-restrict-new-kv-backed-namespaces/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-09-restrict-new-kv-backed-namespaces/</guid><description>
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/best-practices/access-durable-objects-storage/#create-sqlite-backed-durable-object-class&quot;&gt;SQLite storage backend&lt;/a&gt;, which has been recommended for all new Durable Objects since it became &lt;a href=&quot;https://blog.cloudflare.com/sqlite-in-durable-objects/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;generally available&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; in 2024.&lt;/p&gt;
&lt;p&gt;Create a new class with a &lt;code&gt;new_sqlite_classes&lt;/code&gt; migration:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;migrations&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;tag&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;v1&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;new_sqlite_classes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;MyDurableObject&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;migrations&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;tag = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;v1&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;new_sqlite_classes = [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MyDurableObject&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;SQLite-backed Durable Objects have feature parity with the key-value backend — including the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/sqlite-storage-api/#synchronous-kv-api&quot;&gt;key-value storage API&lt;/a&gt; — and additionally support relational &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/sqlite-storage-api/#sql-api&quot;&gt;SQL queries&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/sqlite-storage-api/#pitr-point-in-time-recovery-api&quot;&gt;point-in-time recovery&lt;/a&gt; to restore an object&apos;s storage to any point in the past 30 days.&lt;/p&gt;
&lt;p&gt;If you attempt to create a new key-value backed namespace (a &lt;code&gt;new_classes&lt;/code&gt; migration) on an affected account, the deployment fails with the following error:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;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.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/&quot;&gt;Durable Objects migrations&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Cloudflare Tunnel, Cloudflare Tunnel for SASE, Cloudflare Mesh - Zero Trust Networks route endpoints and Cloudflare Tunnel connections field retiring on October 5, 2026</title><link>https://developers.cloudflare.com/changelog/post/2026-07-09-tunnel-routes-and-connections-api-changes/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-09-tunnel-routes-and-connections-api-changes/</guid><description>&lt;p&gt;On &lt;strong&gt;October 5, 2026&lt;/strong&gt;, two changes take effect across the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/&quot;&gt;Zero Trust Networks API&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/&quot;&gt;Cloudflare Tunnel API&lt;/a&gt;: the CIDR-encoded route endpoints are removed, and tunnel list and get responses no longer include the &lt;code&gt;connections&lt;/code&gt; field. If you manage private network routes or read tunnel connection details through the API, &lt;code&gt;cloudflared&lt;/code&gt;, Terraform, or another integration, review the changes in the following sections and migrate before the removal date.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;route-endpoints&quot;&gt;Route endpoints&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#route-endpoints&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The CIDR-encoded route endpoints are deprecated in favor of the standard, &lt;code&gt;route_id&lt;/code&gt;-based endpoints that already exist today. Both sets of endpoints route a private network through &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;Cloudflare Mesh&lt;/a&gt; (the API still refers to Mesh nodes as &lt;code&gt;warp_connector&lt;/code&gt;) — only the request shape changes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Deprecated endpoints (removed October 5, 2026):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a tunnel route (CIDR Endpoint): &lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/routes/subresources/networks/methods/create/&quot;&gt;&lt;code&gt;POST /accounts/{account_id}/teamnet/routes/network/{ip_network_encoded}&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Update a tunnel route (CIDR Endpoint): &lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/routes/subresources/networks/methods/edit/&quot;&gt;&lt;code&gt;PATCH /accounts/{account_id}/teamnet/routes/network/{ip_network_encoded}&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Delete a tunnel route (CIDR Endpoint): &lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/routes/subresources/networks/methods/delete/&quot;&gt;&lt;code&gt;DELETE /accounts/{account_id}/teamnet/routes/network/{ip_network_encoded}&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Replacement endpoints:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a tunnel route: &lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/routes/methods/create/&quot;&gt;&lt;code&gt;POST /accounts/{account_id}/teamnet/routes&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Update a tunnel route: &lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/routes/methods/edit/&quot;&gt;&lt;code&gt;PATCH /accounts/{account_id}/teamnet/routes/{route_id}&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Delete a tunnel route: &lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/routes/methods/delete/&quot;&gt;&lt;code&gt;DELETE /accounts/{account_id}/teamnet/routes/{route_id}&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-is-changing&quot;&gt;What is changing&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-is-changing&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&quot;text-align: left&quot;&gt;&lt;/th&gt;
&lt;th style=&quot;text-align: left&quot;&gt;Deprecated (CIDR-encoded path)&lt;/th&gt;
&lt;th style=&quot;text-align: left&quot;&gt;Replacement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left&quot;&gt;Route identifier&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;URL-encoded CIDR in the path (&lt;code&gt;/network/{ip_network_encoded}&lt;/code&gt;)&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;route_id&lt;/code&gt; in the path (&lt;code&gt;network&lt;/code&gt; moves to the request body on create)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left&quot;&gt;Create&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;POST .../teamnet/routes/network/{ip_network_encoded}&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;POST .../teamnet/routes&lt;/code&gt; with &lt;code&gt;network&lt;/code&gt; and &lt;code&gt;tunnel_id&lt;/code&gt; in the body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left&quot;&gt;Update&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;PATCH .../teamnet/routes/network/{ip_network_encoded}&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;PATCH .../teamnet/routes/{route_id}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: left&quot;&gt;Delete&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;DELETE .../teamnet/routes/network/{ip_network_encoded}&lt;/code&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: left&quot;&gt;&lt;code&gt;DELETE .../teamnet/routes/{route_id}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;action-required&quot;&gt;Action required&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#action-required&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Capture each route&apos;s &lt;code&gt;route_id&lt;/code&gt; by calling &lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/subresources/routes/methods/list/&quot;&gt;List tunnel routes&lt;/a&gt;, or read it from the response the first time you create a route with the replacement endpoint.&lt;/li&gt;
&lt;li&gt;Update any scripts, backend services, or CI/CD pipelines that call the CIDR-encoded endpoints directly.&lt;/li&gt;
&lt;li&gt;If you manage routes with the &lt;code&gt;cloudflared tunnel route ip add | delete&lt;/code&gt; commands, upgrade &lt;code&gt;cloudflared&lt;/code&gt; to the &lt;a href=&quot;https://github.com/cloudflare/cloudflared/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;latest version&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you manage routes with Terraform, make sure you are on a current version of the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/zero_trust_tunnel_cloudflared_route&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_zero_trust_tunnel_cloudflared_route&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; resource and the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Terraform provider&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Before: create a route by URL-encoding the CIDR into the path&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/teamnet/routes/network/172.16.0.0%2F16&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&quot;tunnel_id&quot;: &quot;&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$TUNNEL_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;&quot;, &quot;comment&quot;: &quot;Example comment for this route.&quot;}&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# After: create a route with the network in the request body&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/teamnet/routes&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&quot;network&quot;: &quot;172.16.0.0/16&quot;, &quot;tunnel_id&quot;: &quot;&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$TUNNEL_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;&quot;, &quot;comment&quot;: &quot;Example comment for this route.&quot;}&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# After: update or delete a route using its route_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; PATCH&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/teamnet/routes/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ROUTE_ID &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&quot;comment&quot;: &quot;Updated comment for this route.&quot;}&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; DELETE&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/teamnet/routes/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ROUTE_ID &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cloudflare-tunnel-and-cloudflare-mesh-connections&quot;&gt;Cloudflare Tunnel and Cloudflare Mesh connections&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cloudflare-tunnel-and-cloudflare-mesh-connections&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Starting the same day, the &lt;code&gt;connections&lt;/code&gt; array is removed from list and get responses for &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;Cloudflare Mesh&lt;/a&gt; nodes (the &lt;code&gt;cfd_tunnel&lt;/code&gt; and &lt;code&gt;warp_connector&lt;/code&gt; API resources). Query the dedicated connections endpoint instead of reading the field off the tunnel or node object.&lt;/p&gt;
&lt;p&gt;This affects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/subresources/cloudflared/methods/list/&quot;&gt;&lt;code&gt;GET /accounts/{account_id}/cfd_tunnel&lt;/code&gt;&lt;/a&gt; — &lt;code&gt;connections&lt;/code&gt; removed from each item in &lt;code&gt;result&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/subresources/cloudflared/methods/get/&quot;&gt;&lt;code&gt;GET /accounts/{account_id}/cfd_tunnel/{tunnel_id}&lt;/code&gt;&lt;/a&gt; — &lt;code&gt;connections&lt;/code&gt; removed from &lt;code&gt;result&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/subresources/warp_connector/methods/list/&quot;&gt;&lt;code&gt;GET /accounts/{account_id}/warp_connector&lt;/code&gt;&lt;/a&gt; — &lt;code&gt;connections&lt;/code&gt; removed from each item in &lt;code&gt;result&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/subresources/warp_connector/methods/get/&quot;&gt;&lt;code&gt;GET /accounts/{account_id}/warp_connector/{tunnel_id}&lt;/code&gt;&lt;/a&gt; — &lt;code&gt;connections&lt;/code&gt; removed from &lt;code&gt;result&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;action-required-1&quot;&gt;Action required&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#action-required-1&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Fetch connection details from the tunnel-specific connections endpoint instead of parsing it off the list or get response. For Cloudflare Tunnel, call &lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/subresources/cloudflared/subresources/connections/methods/get/&quot;&gt;&lt;code&gt;GET /accounts/{account_id}/cfd_tunnel/{tunnel_id}/connections&lt;/code&gt;&lt;/a&gt;. For Cloudflare Mesh, call &lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/subresources/warp_connector/subresources/connections/methods/get/&quot;&gt;&lt;code&gt;GET /accounts/{account_id}/warp_connector/{tunnel_id}/connections&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Before: read connections off the tunnel object&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/cfd_tunnel/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$TUNNEL_ID &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# After: query connections directly&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/cfd_tunnel/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$TUNNEL_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/connections&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Update any dashboards, monitoring scripts, or automation that parses &lt;code&gt;connections&lt;/code&gt; from the tunnel list or get response. &lt;code&gt;cloudflared&lt;/code&gt; and the Cloudflare Terraform provider do not read this field, so no changes are required on their side for this part of the update.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;why-we-are-making-these-changes&quot;&gt;Why we are making these changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#why-we-are-making-these-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Smaller, faster responses.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A single way to identify a route.&lt;/strong&gt; Consolidating on &lt;code&gt;route_id&lt;/code&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistency across the API.&lt;/strong&gt; Both changes align these endpoints with Cloudflare&apos;s standard REST conventions for resource identifiers and nested detail endpoints.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To learn more, refer to the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/networks/&quot;&gt;Zero Trust Networks API&lt;/a&gt;, the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/tunnels/&quot;&gt;Cloudflare Tunnel API&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/routes/&quot;&gt;Routes&lt;/a&gt; documentation.&lt;/p&gt;</description><pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate><product>Cloudflare Tunnel</product><category>Cloudflare Tunnel</category><category>Cloudflare Tunnel for SASE</category><category>Cloudflare Mesh</category></item><item><title>Workers - Send npm package dependency metadata with Worker uploads</title><link>https://developers.cloudflare.com/changelog/post/2026-07-07-wrangler-deploy-upload-dependencies-metadata/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-07-wrangler-deploy-upload-dependencies-metadata/</guid><description>
&lt;p&gt;Wrangler now collects npm package dependency information from your project&apos;s &lt;code&gt;package.json&lt;/code&gt; during &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#deploy&quot;&gt;&lt;code&gt;wrangler deploy&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#upload&quot;&gt;&lt;code&gt;wrangler versions upload&lt;/code&gt;&lt;/a&gt;, and includes it in the upload metadata sent to the Cloudflare API. This data, each dependency&apos;s name, declared version range, and exact installed version, enables dependency analytics and future supply chain security features such as vulnerability alerting.&lt;/p&gt;
&lt;p&gt;To opt out, set &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/#top-level-only-keys&quot;&gt;&lt;code&gt;dependencies_instrumentation.enabled&lt;/code&gt;&lt;/a&gt; to &lt;code&gt;false&lt;/code&gt; in your Wrangler configuration file:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;dependencies_instrumentation&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;enabled&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;dependencies_instrumentation&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;enabled = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;false&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;For more details, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/#top-level-only-keys&quot;&gt;Wrangler configuration&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Search - Filter AI Search list items by exact object key</title><link>https://developers.cloudflare.com/changelog/post/2026-07-08-ai-search-list-items-key-filter/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-08-ai-search-list-items-key-filter/</guid><description>&lt;p&gt;In &lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt;, you can upload files to an instance, or connect a &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/&quot;&gt;data source&lt;/a&gt; such as an R2 bucket, to make your content searchable with natural language. Each file becomes an &lt;strong&gt;item&lt;/strong&gt; identified by an object &lt;strong&gt;key&lt;/strong&gt; (its filename or path). The &lt;a href=&quot;https://developers.cloudflare.com/ai-search/api/items/rest-api/&quot;&gt;list items endpoint&lt;/a&gt; returns the items in an instance.&lt;/p&gt;
&lt;p&gt;That endpoint now accepts a &lt;code&gt;key&lt;/code&gt; 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 &lt;code&gt;item_id&lt;/code&gt; filter for when you know the key but not the ID.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&amp;lt;ACCOUNT_ID&amp;gt;/ai-search/instances/&amp;lt;INSTANCE_NAME&amp;gt;/items?key=docs/readme.md&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &amp;lt;API_TOKEN&amp;gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Keys are unique per data source, so combine &lt;code&gt;key&lt;/code&gt; with &lt;code&gt;source&lt;/code&gt; (for example, &lt;code&gt;source=builtin&lt;/code&gt;) to disambiguate when the same key exists across multiple sources.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-search/api/items/rest-api/&quot;&gt;managing items&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Workers AI, AI Search - Workers AI toMarkdown and AI Search now supports GIF and BMP image conversion</title><link>https://developers.cloudflare.com/changelog/post/2026-07-08-gif-bmp-image-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-08-gif-bmp-image-support/</guid><description>&lt;p&gt;Workers AI &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/&quot;&gt;Markdown conversion&lt;/a&gt; (&lt;code&gt;toMarkdown&lt;/code&gt;) now supports &lt;code&gt;.gif&lt;/code&gt; and &lt;code&gt;.bmp&lt;/code&gt; image files, in addition to the JPEG, PNG, WebP, and SVG formats already supported.&lt;/p&gt;
&lt;p&gt;GIF and BMP files run through the same &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/how-it-works/#images&quot;&gt;image pipeline&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; uses &lt;code&gt;toMarkdown&lt;/code&gt; automatically to process the files it ingests, so any &lt;code&gt;.gif&lt;/code&gt; and &lt;code&gt;.bmp&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/&quot;&gt;Markdown conversion&lt;/a&gt; and the full list of &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/#supported-file-types&quot;&gt;AI Search&apos;s supported file types&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category><category>AI Search</category></item><item><title>Cloudflare One, Cloudflare WAN - IPsec downgrade protection (beta)</title><link>https://developers.cloudflare.com/changelog/post/2026-07-08-ipsec-downgrade-protection/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-08-ipsec-downgrade-protection/</guid><description>&lt;p&gt;Cloudflare IPsec now supports the &lt;a href=&quot;https://datatracker.ietf.org/doc/draft-ietf-ipsecme-ikev2-downgrade-prevention/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;IKE_SA_INIT_FULL_TRANSCRIPT_AUTH&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; IKEv2 extension to protect against downgrade attacks on IPsec tunnels.&lt;/p&gt;
&lt;p&gt;IKEv2&apos;s original authentication design has each endpoint sign only its own outbound messages, not the full handshake transcript. A quantum-capable &lt;a href=&quot;https://www.cloudflare.com/learning/security/threats/on-path-attack/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;on-path attacker&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; can exploit this to bypass post-quantum key exchange by downgrading the connection to classical cryptography. The &lt;code&gt;IKE_SA_INIT_FULL_TRANSCRIPT_AUTH&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;Key details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Available in beta for Cloudflare WAN and Magic Transit IPsec tunnels.&lt;/li&gt;
&lt;li&gt;Cloudflare sends the &lt;code&gt;IKE_SA_INIT_FULL_TRANSCRIPT_AUTH&lt;/code&gt; notification unconditionally as a responder when the feature flag is enabled.&lt;/li&gt;
&lt;li&gt;Both the initiator (your device) and responder (Cloudflare) must support the extension for downgrade protection to be effective.&lt;/li&gt;
&lt;li&gt;This feature is currently gated by a per-account feature flag. Contact your account team to turn it on.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/reference/gre-ipsec-tunnels/#improved-downgrade-protection-beta&quot;&gt;Downgrade protection&lt;/a&gt; for more details.&lt;/p&gt;</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category><category>Cloudflare WAN</category></item><item><title>Cloudflare Network Firewall, Magic Transit, Cloudflare WAN - IP lists, IDS, and SIP rules supported in Unified Routing</title><link>https://developers.cloudflare.com/changelog/post/2026-07-08-unified-routing-iplist-ids-sip/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-08-unified-routing-iplist-ids-sip/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-network-firewall/&quot;&gt;Cloudflare Advanced Network Firewall&lt;/a&gt; IP lists, IDS, and SIP rules are now supported for accounts using &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/reference/traffic-steering/#unified-routing-mode-beta&quot;&gt;Unified Routing&lt;/a&gt; mode. These features require a Cloudflare Advanced Network Firewall subscription.&lt;/p&gt;
&lt;p&gt;Support for additional features - Threat Intel Lists, Rate Limiting, and Managed Rulesets - is planned.&lt;/p&gt;
&lt;p&gt;For the full list of current beta limitations, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/reference/traffic-steering/#beta-limitations&quot;&gt;Traffic steering beta limitations&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><product>Cloudflare Network Firewall</product><category>Cloudflare Network Firewall</category><category>Magic Transit</category><category>Cloudflare WAN</category></item><item><title>R2 SQL - Query R2 Data Catalog tables with R2 SQL from the dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-07-08-query-r2-sql-from-dashboard/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-08-query-r2-sql-from-dashboard/</guid><description>
&lt;p&gt;You can now query your &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; tables with &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; directly from the Cloudflare dashboard, without installing a CLI or wiring up a client. This makes it easy to explore your &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; data, validate queries, and inspect results in one place.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3080,height=1696,format=webp/_astro/r2-sql-studio.DCmHJaqy.png&quot; alt=&quot;R2 SQL Query Editor&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3080&quot; height=&quot;1696&quot;&gt;
&lt;p&gt;To get started, go to &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/data-catalog/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;R2 Data Catalog&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; in the Cloudflare dashboard and select &lt;strong&gt;Query data&lt;/strong&gt; to launch the built-in SQL editor. From there you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Write and run queries interactively&lt;/strong&gt; — Iterate on R2 SQL directly in the browser with syntax highlighting and autocomplete, instead of re-running commands through Wrangler or the REST API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explore your data&lt;/strong&gt; — Explore your namespaces and tables alongside the editor so you can discover what&apos;s queryable without leaving the page or using other tools.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Understand results and performance&lt;/strong&gt; — View result sets with per-query statistics, export them, and get helpful &lt;code&gt;EXPLAIN&lt;/code&gt; outputs to see exactly how a query runs.&lt;/li&gt;
&lt;/ul&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;Your R2 SQL credential is generated and stored for you and can be rotated in the R2 Data Catalog settings page.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Workers AI - Moondream 3.1 now available on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2026-07-08-moondream3.1-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-08-moondream3.1-workers-ai/</guid><description>&lt;p&gt;Partnering with &lt;a href=&quot;https://moondream.ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Moondream&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to bring their latest model &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/moondream3.1-9B-A2B/&quot;&gt;&lt;code&gt;@cf/moondream/moondream3.1-9B-A2B&lt;/code&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Moondream 3.1 is designed for real-world vision tasks, with a 32K token context window for handling complex queries and structured outputs.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-capabilities&quot;&gt;Key capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Query&lt;/strong&gt; — ask open-ended questions about an image, with an optional reasoning parameter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Caption&lt;/strong&gt; — generate short, normal, or long descriptions of an image&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Point&lt;/strong&gt; — return coordinates for objects matching a target phrase&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Detect&lt;/strong&gt; — return bounding boxes for objects matching a target phrase&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;real-time-vision-at-the-edge&quot;&gt;Real-time vision at the edge&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#real-time-vision-at-the-edge&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Vision workloads like live camera feeds, robotics, content moderation, and interactive agents need answers in milliseconds, not seconds. Moondream 3.1&apos;s small active footprint (2B active parameters) pairs well with Workers AI&apos;s serverless, globally distributed inference: requests run close to your users, and streaming responses start returning tokens almost immediately.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;End-to-end (p50)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;query&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~770 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;caption&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~480 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;point&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~145 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;detect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~160 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Use Moondream 3.1 through the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/bindings/&quot;&gt;Workers AI binding&lt;/a&gt; (&lt;code&gt;env.AI.run()&lt;/code&gt;) or the REST API at &lt;code&gt;/ai/run&lt;/code&gt;. You can also use &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt; with these endpoints.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/moondream3.1-9B-A2B/&quot;&gt;Moondream 3.1 model page&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workers - Cloudflare Drop</title><link>https://developers.cloudflare.com/changelog/post/2026-07-08-cloudflare-drag-and-drop/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-08-cloudflare-drag-and-drop/</guid><description>&lt;p&gt;&lt;a href=&quot;https://cloudflare.com/drop&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Drop&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; lets you deploy a static site to Cloudflare without requiring a Cloudflare account to get started.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2498,height=1294,format=webp/_astro/cloudflare-drag-and-drop-upload.KujM69eS.png&quot; alt=&quot;Cloudflare Drag and Drop upload screen for browsing folders or ZIP files&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2498&quot; height=&quot;1294&quot;&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/claim-deployments/&quot;&gt;claim the deployment&lt;/a&gt; to keep it.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2936,height=1594,format=webp/_astro/cloudflare-drag-and-drop-preview.BQ1__XRX.png&quot; alt=&quot;Cloudflare Drag and Drop temporary live preview screen with claim and copy claim link actions&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2936&quot; height=&quot;1594&quot;&gt;
&lt;p&gt;When you are ready to make the deployment permanent, click &lt;strong&gt;Claim&lt;/strong&gt; 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.&lt;/p&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;If you are creating a new account, you will need to verify your email address before continuing.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1712,height=812,format=webp/_astro/cloudflare-drag-and-drop-claim.8Zv6px9B.png&quot; alt=&quot;Cloudflare Drag and Drop claim account screen with a countdown before the claim link expires&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1712&quot; height=&quot;812&quot;&gt;
&lt;p&gt;After claiming the site, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Add a domain&lt;/strong&gt;: &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/routing/custom-domains/&quot;&gt;Connect&lt;/a&gt; an existing domain or purchase a new one for your site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/&quot;&gt;observability&lt;/a&gt;&lt;/strong&gt;: Monitor your site&apos;s performance and usage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/&quot;&gt;Markdown for Agents&lt;/a&gt;&lt;/strong&gt;: Allow AI agents to access your site&apos;s content in Markdown.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control access&lt;/strong&gt;: Make your site &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/&quot;&gt;private&lt;/a&gt; and choose who can view it.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1812,height=1266,format=webp/_astro/cloudflare-drag-and-drop-post-claim.DvlaNmI7.png&quot; alt=&quot;Claimed Cloudflare Drag and Drop site setup screen showing options to add a domain, control access, enable observability, and enable Markdown for agents&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1812&quot; height=&quot;1266&quot;&gt;</description><pubDate>Wed, 08 Jul 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare One Client - Cloudflare One Client for Windows (version 2026.6.850.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-07-07-warp-windows-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-07-warp-windows-ga/</guid><description>&lt;p&gt;A new GA release for the Windows Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
</description><pubDate>Tue, 07 Jul 2026 18:35:35 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Workflows - Workflows pricing adds per-step billing. Step and storage billing to start no earlier than August 10, 2026.</title><link>https://developers.cloudflare.com/changelog/post/2026-07-07-workflows-billing-updates/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-07-workflows-billing-updates/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt; pricing now includes per-step billing. Requests and CPU time billing have been enabled since the initial public beta and is not changing.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;workflows-adds-step-billing&quot;&gt;Workflows adds step billing&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#workflows-adds-step-billing&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A step is each unit of work executed by a Workflow, including step operations such as &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/sleeping-and-retrying/&quot;&gt;sleeping&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/events-and-parameters/&quot;&gt;waiting for events&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can query Workflows analytics, including &lt;code&gt;stepCount&lt;/code&gt; for a Workflow instance, with the &lt;a href=&quot;https://developers.cloudflare.com/workflows/observability/metrics-analytics/#query-via-the-graphql-api&quot;&gt;GraphQL Analytics API&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;steps-and-storage-billing-to-take-effect-august-10th-2026&quot;&gt;Steps and storage billing to take effect August 10th, 2026&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#steps-and-storage-billing-to-take-effect-august-10th-2026&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Starting no earlier than August 10th, 2026, Cloudflare will begin billing for step and storage usage on Workers Paid plans.&lt;/p&gt;
&lt;p&gt;Storage pricing has been published since Workflows became generally available and is not changing.  Storage is measured as persisted Workflow state in GB-months.&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Workers Free&lt;/th&gt;
&lt;th&gt;Workers Paid&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Steps&lt;/td&gt;
&lt;td&gt;3,000 included per day&lt;/td&gt;
&lt;td&gt;500,000 included per month, then $0.80 per additional 100,000 steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;1 GB-month included&lt;/td&gt;
&lt;td&gt;1 GB-month included, then $0.20 per additional GB-month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Developers on the Workers Free plan will not be charged for steps or storage beyond the included amounts.&lt;/p&gt;
&lt;p&gt;Cloudflare will not bill step and storage usage before August 10, 2026.&lt;/p&gt;
&lt;p&gt;You can review Workflows usage in the &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/workflows/reference/pricing/&quot;&gt;Workflows pricing&lt;/a&gt; page for full details.&lt;/p&gt;</description><pubDate>Tue, 07 Jul 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>Access, Cloudflare One - File transfer controls for browser-based RDP (beta)</title><link>https://developers.cloudflare.com/changelog/post/2026-07-07-rdp-file-transfer-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-07-rdp-file-transfer-beta/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1356,height=692,format=webp/_astro/file-transfer-policy-control.CiSEa5rr.png&quot; alt=&quot;File transfer connection settings in the Access policy configuration.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1356&quot; height=&quot;692&quot;&gt;
&lt;p&gt;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&apos;s personal device.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;configuration-options&quot;&gt;Configuration options&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#configuration-options&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;File transfer controls are configured per policy within your Access application, alongside existing &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/rdp/rdp-browser/#connection-settings&quot;&gt;text clipboard controls&lt;/a&gt;. For each policy, you can select one of the following options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Client to remote RDP session allowed&lt;/strong&gt; — Users can upload files from their local machine into the browser-based RDP session.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remote RDP session to client allowed&lt;/strong&gt; — Users can download files from the browser-based RDP session to their local machine.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Both directions allowed&lt;/strong&gt; — Users can upload and download files between their local machine and the browser-based RDP session.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disable copying/pasting&lt;/strong&gt; — Users are not allowed to transfer files between their local machine and the browser-based RDP session.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By default, file transfer is denied for new policies. For existing Access applications created before this feature was available, file transfer remains denied.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;how-it-works&quot;&gt;How it works&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#how-it-works&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=812,height=532,format=webp/_astro/clipboard-side-panel.Us2RfXfs.png&quot; alt=&quot;The clipboard side panel showing files available for transfer.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;812&quot; height=&quot;532&quot;&gt;&lt;img src=&quot;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&quot; alt=&quot;A remote document ready for download or local printing.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;770&quot; height=&quot;442&quot;&gt;
&lt;p&gt;This feature is in beta and available on all Zero Trust plans. For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/rdp/rdp-browser/#transfer-files&quot;&gt;File transfer for browser-based RDP&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category><category>Cloudflare One</category></item><item><title>Browser Isolation, Cloudflare One - Browser Isolation support for authorization proxy endpoints</title><link>https://developers.cloudflare.com/changelog/post/2026-07-07-authorization-proxy-endpoint-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-07-authorization-proxy-endpoint-support/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/&quot;&gt;Browser Isolation&lt;/a&gt; now supports Gateway &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#authorization-endpoint&quot;&gt;authorization proxy endpoints&lt;/a&gt;. You can apply &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/isolation-policies/&quot;&gt;HTTP Isolate policies&lt;/a&gt; to traffic routed through authorization proxy endpoints, the same way you can for traffic from the Cloudflare One Client.&lt;/p&gt;
&lt;p&gt;Previously, only &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#source-ip-endpoint&quot;&gt;source IP proxy endpoints&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;To get started, &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#authorization-endpoint&quot;&gt;create an authorization proxy endpoint&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/isolation-policies/&quot;&gt;build an Isolate policy&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><product>Browser Isolation</product><category>Browser Isolation</category><category>Cloudflare One</category></item><item><title>Browser Run - New Browser Run endpoint for accessibility trees</title><link>https://developers.cloudflare.com/changelog/post/2026-07-07-browser-run-accessibility-tree-endpoint/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-07-browser-run-accessibility-tree-endpoint/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/&quot;&gt;Browser Run&lt;/a&gt; now supports a standalone &lt;code&gt;/accessibilityTree&lt;/code&gt; endpoint, giving agent and automation workflows direct access to the browser&apos;s accessibility tree for a rendered webpage.&lt;/p&gt;
&lt;p&gt;An accessibility tree is the browser&apos;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;With the new &lt;code&gt;/accessibilityTree&lt;/code&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/snapshot/&quot;&gt;&lt;code&gt;/snapshot&lt;/code&gt;&lt;/a&gt; endpoint, which also returns Markdown, HTML, and screenshots.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;https://api.cloudflare.com/client/v4/accounts/&amp;lt;accountId&amp;gt;/browser-run/accessibilityTree&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer &amp;lt;apiToken&amp;gt;&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;url&quot;: &quot;https://example.com/&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;success&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;result&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;accessibilityTree&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;RootWebArea&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Example Domain&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;children&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;heading&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Example Domain&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;level&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;role&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;link&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Learn more&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Use &lt;code&gt;interestingOnly&lt;/code&gt; to return only semantically meaningful nodes, or &lt;code&gt;root&lt;/code&gt; to capture the accessibility tree for a specific subtree.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/accessibility-tree-endpoint/&quot;&gt;&lt;code&gt;/accessibilityTree&lt;/code&gt; documentation&lt;/a&gt; for usage examples and supported parameters.&lt;/p&gt;</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>Logs - New WebSocket Analytics Logpush dataset</title><link>https://developers.cloudflare.com/changelog/post/2026-07-07-websocket-analytics-dataset/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-07-websocket-analytics-dataset/</guid><description>&lt;p&gt;Enterprise customers can now push per-connection WebSocket analytics to any &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/enable-destinations/&quot;&gt;Logpush destination&lt;/a&gt; using the new &lt;code&gt;websocket_analytics&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;Key fields include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ConnectionCloseReason&lt;/code&gt;&lt;/strong&gt; — why the connection ended: &lt;code&gt;peerReset&lt;/code&gt;, &lt;code&gt;peerNoError&lt;/code&gt;, &lt;code&gt;timedOut&lt;/code&gt;, &lt;code&gt;upstreamReset&lt;/code&gt;, &lt;code&gt;protocolViolation&lt;/code&gt;, &lt;code&gt;unspecifiedError&lt;/code&gt;, or &lt;code&gt;none&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ConnectionCloseSource&lt;/code&gt;&lt;/strong&gt; — which side initiated the close: &lt;code&gt;upstream&lt;/code&gt;, &lt;code&gt;downstream&lt;/code&gt;, &lt;code&gt;me&lt;/code&gt;, or &lt;code&gt;both&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ConnectionTransportCloseCode&lt;/code&gt;&lt;/strong&gt; — the TLS alert code or TCP-level close code for additional precision.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;RayID&lt;/code&gt;&lt;/strong&gt; — correlate WebSocket connection events with your existing HTTP Request logs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The dataset also includes directional byte counts (&lt;code&gt;BytesSentClient&lt;/code&gt;, &lt;code&gt;BytesReceivedClient&lt;/code&gt;, &lt;code&gt;BytesSentOrigin&lt;/code&gt;, &lt;code&gt;BytesReceivedOrigin&lt;/code&gt;), connection timestamps, client IP, colo code, and request metadata from the original WebSocket upgrade.&lt;/p&gt;
&lt;p&gt;This data lets you build alerts on connection close patterns — for example, detecting spikes in TCP resets (&lt;code&gt;ConnectionCloseReason == &quot;peerReset&quot;&lt;/code&gt;) grouped by host and data center — directly in your existing log analysis tools.&lt;/p&gt;
&lt;p&gt;For the full list of available fields, refer to &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/zone/websocket_analytics/&quot;&gt;WebSocket Analytics&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>R2, R2 Data Catalog - R2 Data Catalog warns before you delete data manually</title><link>https://developers.cloudflare.com/changelog/post/2026-07-06-r2-data-catalog-delete-warnings/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-06-r2-data-catalog-delete-warnings/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; is a managed &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;dashboard&quot;&gt;Dashboard&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#dashboard&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1886,height=684,format=webp/_astro/data-catalog-delete-warning.DoBR0sFO.png&quot; alt=&quot;R2 dashboard warning shown before deleting objects from a Data Catalog-enabled bucket&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1886&quot; height=&quot;684&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;wrangler&quot;&gt;Wrangler&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#wrangler&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Wrangler now checks whether a bucket is Data Catalog-enabled before running a delete and warns you before continuing:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;Data Catalog is enabled for this bucket. &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;Proceeding may leave the data catalog in an invalid state. Continue?&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To learn how to safely manage and delete data in your tables, refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category><category>R2 Data Catalog</category></item><item><title>Cloudflare One Appliance, Cloudflare One, Cloudflare WAN - Self-serve registration of Cloudflare One Virtual Appliance in the dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-07-06-virtual-appliance-self-serve-ui/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-06-virtual-appliance-self-serve-ui/</guid><description>&lt;p&gt;You can now register a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/&quot;&gt;Cloudflare One Virtual Appliance&lt;/a&gt; and generate its license key directly from the dashboard, without contacting your account team.&lt;/p&gt;
&lt;img src=&quot;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&quot; alt=&quot;Registering a Cloudflare One Virtual Appliance and generating its authentication key from the Connectors page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1800&quot; height=&quot;988&quot;&gt;
&lt;ul&gt;
&lt;li&gt;On the &lt;strong&gt;Connectors&lt;/strong&gt; page, select &lt;strong&gt;Add an appliance&lt;/strong&gt; and choose &lt;strong&gt;Virtual appliance&lt;/strong&gt; to register a virtual appliance and generate its authentication key.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;Regenerate authentication key&lt;/strong&gt; from a virtual appliance connector&apos;s menu to rotate its key. The previous key is immediately and irrevocably revoked.&lt;/li&gt;
&lt;li&gt;The authentication key is shown only once — copy and store it securely.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This complements the existing &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/configure-virtual-appliance/#register-a-virtual-appliance-and-generate-a-license-key&quot;&gt;API and Terraform self-serve workflow&lt;/a&gt; for provisioning virtual appliances. Hardware appliances continue to use the existing account-team fulfillment workflow.&lt;/p&gt;
&lt;p&gt;For details, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/configure-virtual-appliance/&quot;&gt;Configure a Cloudflare One Virtual Appliance&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 06 Jul 2026 00:00:00 GMT</pubDate><product>Cloudflare One Appliance</product><category>Cloudflare One Appliance</category><category>Cloudflare One</category><category>Cloudflare WAN</category></item><item><title>Durable Objects, Workers - Declare Durable Object class lifecycle with `exports`</title><link>https://developers.cloudflare.com/changelog/post/2026-06-30-declarative-do-class-exports/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-30-declarative-do-class-exports/</guid><description>&lt;p&gt;A new declarative &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/&quot;&gt;&lt;code&gt;exports&lt;/code&gt;&lt;/a&gt; field in your Wrangler configuration file replaces the imperative &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/reference/durable-object-class-migrations-legacy/&quot;&gt;&lt;code&gt;migrations&lt;/code&gt;&lt;/a&gt; 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&apos;s already deployed to determine what Durable Object state needs to be created, renamed, or deleted.&lt;/p&gt;
&lt;p&gt;With legacy migrations, renaming &lt;code&gt;ChatRoom&lt;/code&gt; to &lt;code&gt;Room&lt;/code&gt; requires retaining both tagged steps:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;Before — legacy migrations&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;jsonc&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;migrations&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{ &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;tag&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;v1&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;new_sqlite_classes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ChatRoom&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;] },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;tag&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;v2&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;renamed_classes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [{ &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;from&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ChatRoom&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;to&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Room&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;With &lt;code&gt;exports&lt;/code&gt;, you instead declare &lt;code&gt;Room&lt;/code&gt; as the current class and mark &lt;code&gt;ChatRoom&lt;/code&gt; as renamed:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;After — declarative exports&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;jsonc&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;exports&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;ChatRoom&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;durable-object&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;state&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;renamed&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;renamed_to&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Room&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;Room&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;durable-object&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;storage&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;sqlite&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Each entry is keyed by class name. The &lt;code&gt;state&lt;/code&gt; field carries the lifecycle (&lt;code&gt;created&lt;/code&gt; by default — a live class — plus tombstone states &lt;code&gt;deleted&lt;/code&gt;, &lt;code&gt;renamed&lt;/code&gt;, and &lt;code&gt;transferred&lt;/code&gt;, and the &lt;code&gt;expecting-transfer&lt;/code&gt; receiving state for cross-Worker transfers).&lt;/p&gt;
&lt;p&gt;Key improvements over the legacy &lt;code&gt;migrations&lt;/code&gt; array:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No migration tags.&lt;/strong&gt; The current &lt;code&gt;exports&lt;/code&gt; map is the source of truth — there is no historical chain of &lt;code&gt;v1&lt;/code&gt;, &lt;code&gt;v2&lt;/code&gt;, &lt;code&gt;v3&lt;/code&gt; entries to maintain.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured deployment output.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero-downtime rename and transfer patterns are first-class.&lt;/strong&gt; Tombstones may coexist with the source class still in code, enabling a &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/#avoid-downtime-during-a-rename&quot;&gt;three-deploy rename&lt;/a&gt; and a &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/#transfer-a-durable-object-class-between-workers&quot;&gt;four-deploy cross-Worker transfer&lt;/a&gt; without runtime errors during the rollout window.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-Worker safety.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Existing Workers using the legacy &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/reference/durable-object-class-migrations-legacy/&quot;&gt;&lt;code&gt;migrations&lt;/code&gt;&lt;/a&gt; array continue to work unchanged. To move to &lt;code&gt;exports&lt;/code&gt;, refer to the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/#migrate-from-the-legacy-migrations-flow&quot;&gt;migration guide&lt;/a&gt;. &lt;code&gt;exports&lt;/code&gt; and &lt;code&gt;migrations&lt;/code&gt; are mutually exclusive within a single Worker.&lt;/p&gt;
&lt;p&gt;For the full reference, refer to &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/&quot;&gt;Durable Object class exports&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Workers - Simpler runtime types with @cloudflare/workers-types v5</title><link>https://developers.cloudflare.com/changelog/post/2026-07-03-workers-types-v5/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-03-workers-types-v5/</guid><description>
&lt;p&gt;We have released version 5 of &lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/workers-types&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@cloudflare/workers-types&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. This release simplifies the package to expose only the latest runtime types.&lt;/p&gt;
&lt;p&gt;We still recommend that you generate types for your Worker using &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#types&quot;&gt;&lt;code&gt;wrangler types&lt;/code&gt;&lt;/a&gt;, but if you want to use the package directly, you can install it with your package manager of choice:&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-npm&quot; id=&quot;pm-tab-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-npm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-yarn&quot; id=&quot;pm-tab-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-yarn&quot; data-nb-pm-tab class=&quot;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&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-pnpm&quot; id=&quot;pm-tab-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-pnpm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-bun&quot; id=&quot;pm-tab-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-bun&quot; data-nb-pm-tab class=&quot;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&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-npm&quot; aria-labelledby=&quot;pm-tab-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i -D @cloudflare/workers-types@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i -D @cloudflare/workers-types@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-yarn&quot; aria-labelledby=&quot;pm-tab-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add -D @cloudflare/workers-types@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add -D @cloudflare/workers-types@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add -D @cloudflare/workers-types@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add -D @cloudflare/workers-types@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-bun&quot; aria-labelledby=&quot;pm-tab-pm-ea6071ab-61e5-4c21-a4a0-d78ba1340c7f-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add -d @cloudflare/workers-types@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add -d @cloudflare/workers-types@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;The package now exposes two entrypoints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@cloudflare/workers-types&lt;/code&gt; reflects the latest compatibility date, using the latest stable compatibility flags.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cloudflare/workers-types/experimental&lt;/code&gt; reflects APIs behind experimental compatibility flags.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The dated entrypoints, such as &lt;code&gt;@cloudflare/workers-types/2022-11-30&lt;/code&gt; and &lt;code&gt;@cloudflare/workers-types/2023-03-01&lt;/code&gt;, are removed. With runtime type generation in &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler v4&lt;/a&gt;, you can generate these with the &lt;code&gt;wrangler types&lt;/code&gt; command to create types locked to your Worker&apos;s compatibility date.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/languages/typescript/&quot;&gt;TypeScript language support&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Search - Manage AI Search sync jobs with Wrangler CLI</title><link>https://developers.cloudflare.com/changelog/post/2026-07-02-manage-sync-jobs/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-02-manage-sync-jobs/</guid><description>&lt;p&gt;When you connect a &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/&quot;&gt;data source&lt;/a&gt; to your &lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; instance, AI Search runs sync jobs to keep your index up to date with your content. You can now manage those jobs directly from &lt;a href=&quot;https://developers.cloudflare.com/ai-search/wrangler-commands/&quot;&gt;Wrangler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For example, you can trigger a sync job from your CI/CD or automated pipelines with the &lt;code&gt;jobs create&lt;/code&gt; command so your index refreshes when you push a change:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ai-search&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; jobs&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-instance&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search jobs create&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Trigger a new sync job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search jobs list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List sync jobs for an instance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search jobs get&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get details for a job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search jobs cancel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cancel a running job&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search jobs logs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;View log entries for a job&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;All commands accept &lt;code&gt;--namespace&lt;/code&gt;/&lt;code&gt;-n&lt;/code&gt; (defaults to &lt;code&gt;default&lt;/code&gt;) and &lt;code&gt;--json&lt;/code&gt; for structured output that automation and AI agents can parse directly. The &lt;code&gt;list&lt;/code&gt; and &lt;code&gt;logs&lt;/code&gt; commands also support &lt;code&gt;--page&lt;/code&gt; and &lt;code&gt;--per-page&lt;/code&gt; for pagination, and &lt;code&gt;cancel&lt;/code&gt; prompts for confirmation unless you pass &lt;code&gt;-y&lt;/code&gt;/&lt;code&gt;--force&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For full usage details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/wrangler-commands/&quot;&gt;AI Search Wrangler commands documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Cache - Cache multiple versions of a URL with Vary</title><link>https://developers.cloudflare.com/changelog/post/2026-07-02-vary-for-cache-rules/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-02-vary-for-cache-rules/</guid><description>&lt;p&gt;Your origin can serve different responses for the same URL — different languages based on &lt;code&gt;Accept-Language&lt;/code&gt;, or different formats based on &lt;code&gt;Accept&lt;/code&gt; — by returning a &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9110.html#name-vary&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;Vary&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; response header. Cloudflare&apos;s cache now honors that header directly in &lt;a href=&quot;https://developers.cloudflare.com/cache/how-to/cache-rules/&quot;&gt;Cache Rules&lt;/a&gt;, 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 &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9111.html#name-calculating-cache-keys-with&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;HTTP caching behavior&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-changed&quot;&gt;What changed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Your origin now decides which request headers matter by listing them in its &lt;code&gt;Vary&lt;/code&gt; response, and you control how Cloudflare treats each one. When you have enabled Vary using a cache rule and a response includes a &lt;code&gt;Vary&lt;/code&gt; header, the request headers listed become part of the cache key.&lt;/p&gt;
&lt;p&gt;For each header your origin varies on, choose one of three actions:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;normalize&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Converts equivalent header values to the same cache key value before matching, collapsing redundant versions.&lt;/td&gt;
&lt;td&gt;Most &lt;code&gt;Accept&lt;/code&gt;, &lt;code&gt;Accept-Language&lt;/code&gt;, and &lt;code&gt;Accept-Encoding&lt;/code&gt; use cases.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;passthrough&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Uses the raw header value to select the cached version and forwards it to the origin unchanged.&lt;/td&gt;
&lt;td&gt;When byte-for-byte differences in the header value should create versions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bypass&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bypasses cache whenever this header name appears in the origin&apos;s &lt;code&gt;Vary&lt;/code&gt; response.&lt;/td&gt;
&lt;td&gt;Per-user values, or headers with too many possible values to cache safely.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;benefits&quot;&gt;Benefits&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#benefits&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Higher cache hit ratios&lt;/strong&gt;: &lt;code&gt;normalize&lt;/code&gt; treats semantically equivalent headers as one version. For example, &lt;code&gt;Accept-Language: en-US, fr;q=0.8&lt;/code&gt; and &lt;code&gt;Accept-Language: fr;q=0.8, en-GB&lt;/code&gt; both resolve to the same cache key, so you serve more requests from cache instead of the origin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Correct content negotiation&lt;/strong&gt;: Requests always receive the cached version that matches their headers, so language and format variants stay accurate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No origin or Worker changes required&lt;/strong&gt;: If your origin already sends &lt;code&gt;Vary&lt;/code&gt;, you configure the behavior entirely in Cache Rules.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standards-aligned&lt;/strong&gt;: Cache key calculation follows RFC 9111, and &lt;code&gt;Vary: *&lt;/code&gt; continues to bypass cache as required by RFC 9110.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;availability&quot;&gt;Availability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#availability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Vary in Cache Rules is available on all plans (Free, Pro, Business, and Enterprise). For per-request control in Workers subrequests, use the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/request/#the-cfvary-property&quot;&gt;&lt;code&gt;cf.vary&lt;/code&gt;&lt;/a&gt; property.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Configure Vary in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/:zone/caching/cache-rules&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; under &lt;strong&gt;Caching&lt;/strong&gt; &amp;gt; &lt;strong&gt;Cache Rules&lt;/strong&gt;, or through the &lt;a href=&quot;https://developers.cloudflare.com/ruleset-engine/rulesets-api/&quot;&gt;Rulesets API&lt;/a&gt;. To learn how Vary affects cache keys and how each action works, refer to &lt;a href=&quot;https://developers.cloudflare.com/cache/concepts/vary/&quot;&gt;Vary&lt;/a&gt; and the &lt;a href=&quot;https://developers.cloudflare.com/cache/how-to/cache-rules/settings/#vary&quot;&gt;Cache Rules Vary setting&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><product>Cache</product><category>Cache</category></item><item><title>Logs - Updated fields across multiple Logpush datasets in Cloudflare Logs</title><link>https://developers.cloudflare.com/changelog/post/2026-07-02-log-fields-updated/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-02-log-fields-updated/</guid><description>&lt;p&gt;Cloudflare has updated &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/&quot;&gt;Logpush datasets&lt;/a&gt;:&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;updated-fields-in-existing-datasets&quot;&gt;Updated fields in existing datasets&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#updated-fields-in-existing-datasets&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gateway DNS&lt;/strong&gt; (added): &lt;code&gt;AppliedMaxTTL&lt;/code&gt; and &lt;code&gt;UpstreamRecordTTLs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gateway HTTP&lt;/strong&gt; (added): &lt;code&gt;Warnings&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP requests&lt;/strong&gt; (added): &lt;code&gt;CacheLockWaitedMs&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the complete field definitions for each dataset, refer to &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/&quot;&gt;Logpush datasets&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>Cloudflare Mesh, Cloudflare One - Hostname routing for Cloudflare Mesh</title><link>https://developers.cloudflare.com/changelog/post/2026-07-02-mesh-hostname-routing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-02-mesh-hostname-routing/</guid><description>
&lt;p&gt;You can now add &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#hostname-routes&quot;&gt;hostname routes&lt;/a&gt; to a Cloudflare Mesh node, in addition to CIDR routes.&lt;/p&gt;
&lt;figure class=&quot;mesh-hostname-diagram not-content&quot; aria-label=&quot;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&quot; data-astro-cid-7hjhdnhq&gt;&lt;ol class=&quot;flow&quot; data-astro-cid-7hjhdnhq&gt;&lt;li class=&quot;flow-step&quot; data-astro-cid-7hjhdnhq&gt;&lt;div class=&quot;node-card client-card&quot; data-astro-cid-7hjhdnhq&gt;&lt;div class=&quot;node-header&quot; data-astro-cid-7hjhdnhq&gt;&lt;span class=&quot;node-icon client-icon&quot; aria-hidden=&quot;true&quot; data-astro-cid-7hjhdnhq&gt;&lt;svg width=&quot;0.98em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 48 49&quot; data-astro-cid-7hjhdnhq=&quot;true&quot; data-icon=&quot;warp-client&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;a class=&quot;node-title&quot; href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/&quot; data-astro-cid-7hjhdnhq&gt;Client device&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;node-caption&quot; data-astro-cid-7hjhdnhq&gt;Requests &lt;code data-astro-cid-7hjhdnhq&gt;wiki.internal.local&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;flow-connector&quot; data-astro-cid-7hjhdnhq&gt;&lt;span class=&quot;connector-label&quot; data-astro-cid-7hjhdnhq&gt;DNS query&lt;/span&gt;&lt;span class=&quot;connector-arrow&quot; aria-hidden=&quot;true&quot; data-astro-cid-7hjhdnhq&gt;↓&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;flow-step&quot; data-astro-cid-7hjhdnhq&gt;&lt;div class=&quot;node-card gateway-card&quot; data-astro-cid-7hjhdnhq&gt;&lt;div class=&quot;node-header&quot; data-astro-cid-7hjhdnhq&gt;&lt;span class=&quot;node-icon gateway-icon&quot; aria-hidden=&quot;true&quot; data-astro-cid-7hjhdnhq&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 16 16&quot; data-astro-cid-7hjhdnhq=&quot;true&quot; data-icon=&quot;gateway&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M8.453 7.238H0l.517.87H8.97zM9.21 8.51H.755l.517.868h8.453z&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;a class=&quot;node-title&quot; href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot; data-astro-cid-7hjhdnhq&gt;Cloudflare Gateway&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;node-caption&quot; data-astro-cid-7hjhdnhq&gt;Returns a token IP, then rewrites the destination to the real private IP.&lt;/p&gt;&lt;div class=&quot;pill-row&quot; data-astro-cid-7hjhdnhq&gt;&lt;span class=&quot;token-pill&quot; data-astro-cid-7hjhdnhq&gt;&lt;code data-astro-cid-7hjhdnhq&gt;172.64.128.0/20&lt;/code&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;flow-connector&quot; data-astro-cid-7hjhdnhq&gt;&lt;a class=&quot;connector-label&quot; href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#hostname-routes&quot; data-astro-cid-7hjhdnhq&gt;Hostname route&lt;/a&gt;&lt;span class=&quot;connector-arrow&quot; aria-hidden=&quot;true&quot; data-astro-cid-7hjhdnhq&gt;↓&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;flow-step&quot; data-astro-cid-7hjhdnhq&gt;&lt;div class=&quot;node-card mesh-card&quot; data-astro-cid-7hjhdnhq&gt;&lt;div class=&quot;node-header&quot; data-astro-cid-7hjhdnhq&gt;&lt;span class=&quot;node-icon mesh-icon&quot; aria-hidden=&quot;true&quot; data-astro-cid-7hjhdnhq&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 32 32&quot; data-astro-cid-7hjhdnhq=&quot;true&quot; data-icon=&quot;cloudflare-mesh&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;a class=&quot;node-title&quot; href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot; data-astro-cid-7hjhdnhq&gt;Mesh node&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;node-caption&quot; data-astro-cid-7hjhdnhq&gt;Forwards traffic to the host on the local network&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;flow-connector&quot; aria-hidden=&quot;true&quot; data-astro-cid-7hjhdnhq&gt;&lt;span class=&quot;connector-arrow&quot; data-astro-cid-7hjhdnhq&gt;↓&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;flow-step&quot; data-astro-cid-7hjhdnhq&gt;&lt;div class=&quot;node-card host-card&quot; data-astro-cid-7hjhdnhq&gt;&lt;div class=&quot;node-header&quot; data-astro-cid-7hjhdnhq&gt;&lt;span class=&quot;node-icon host-icon&quot; aria-hidden=&quot;true&quot; data-astro-cid-7hjhdnhq&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 48 48&quot; data-astro-cid-7hjhdnhq=&quot;true&quot; data-icon=&quot;dns&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;span class=&quot;node-title&quot; data-astro-cid-7hjhdnhq&gt;Private host&lt;/span&gt;&lt;/div&gt;&lt;p class=&quot;node-caption&quot; data-astro-cid-7hjhdnhq&gt;&lt;code data-astro-cid-7hjhdnhq&gt;wiki.internal.local&lt;/code&gt; · &lt;code data-astro-cid-7hjhdnhq&gt;10.0.0.50&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/figure&gt;
&lt;p&gt;Instead of managing IP ranges, you can attract traffic for a hostname to a Mesh node:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Private hostname&lt;/strong&gt; (for example, &lt;code&gt;wiki.internal.local&lt;/code&gt;) — 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Public hostname&lt;/strong&gt; (for example, &lt;code&gt;www.example.com&lt;/code&gt;) — route that hostname&apos;s traffic through the node and egress via the node&apos;s public IP.&lt;/li&gt;
&lt;/ul&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/mesh&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Mesh&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;
&lt;p&gt;For setup steps, prerequisites, and DNS options, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#hostname-routes&quot;&gt;Hostname routes&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><product>Cloudflare Mesh</product><category>Cloudflare Mesh</category><category>Cloudflare One</category></item><item><title>Workers - Work across multiple accounts with Wrangler auth profiles</title><link>https://developers.cloudflare.com/changelog/post/2026-07-02-wrangler-auth-profiles/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-02-wrangler-auth-profiles/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler CLI&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;wrangler login&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;account_id&lt;/code&gt; in your &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/&quot;&gt;Wrangler configuration file&lt;/a&gt; so a command cannot reach the wrong account.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Create a profile for each account, choosing which accounts it can reach&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; auth&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; client-a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; auth&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; activate&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; client-a&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ~/clients/client-a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; auth&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; client-b&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; auth&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; activate&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; client-b&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ~/clients/client-b&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Use the &lt;code&gt;--profile&lt;/code&gt; flag to run a single command with a specific profile:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --profile&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; personal&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;In CI and other automated environments, &lt;code&gt;CLOUDFLARE_API_TOKEN&lt;/code&gt; still takes precedence over all profiles.&lt;/p&gt;
&lt;p&gt;For setup, the resolution order, and the full command reference, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/profiles/&quot;&gt;Authentication profiles&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare One Client - Cloudflare One Client for Linux (version 2026.6.836.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-07-01-warp-linux-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-01-warp-linux-ga/</guid><description>&lt;p&gt;A new GA release for the Linux Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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&amp;#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.&lt;/p&gt;
&lt;p&gt;If you installed version 2026.6.822.0 on an RPM-based distribution, we recommend refreshing your repository configuration:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;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
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Wed, 01 Jul 2026 19:48:17 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Access - Fix redirect URL fragment encoding for single-page applications</title><link>https://developers.cloudflare.com/changelog/post/2026-07-01-spa-redirect-fragment-fix/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-01-spa-redirect-fragment-fix/</guid><description>&lt;p&gt;Access now correctly preserves URL fragment characters (&lt;code&gt;/&lt;/code&gt;, &lt;code&gt;?&lt;/code&gt;, &lt;code&gt;=&lt;/code&gt;, &lt;code&gt;&amp;amp;&lt;/code&gt;, &lt;code&gt;;&lt;/code&gt;) when redirecting users back to an application after login. Previously, these characters were encoded with &lt;code&gt;encodeURIComponent&lt;/code&gt;, which mangled fragment-based routes used by single-page applications (SPAs).&lt;/p&gt;
&lt;p&gt;For example, an SPA URL like &lt;code&gt;https://app.example.com/#/dashboard?tab=settings&amp;amp;view=advanced&lt;/code&gt; would previously redirect to a broken URL after login. This is now handled correctly.&lt;/p&gt;
&lt;p&gt;If your SPA users were experiencing broken navigation after authenticating through Access, this fix resolves the issue without any configuration changes.&lt;/p&gt;</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Access - Independent MFA for infrastructure applications</title><link>https://developers.cloudflare.com/changelog/post/2026-07-01-ssh-mfa-piv-keys/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-01-ssh-mfa-piv-keys/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/infrastructure-apps/&quot;&gt;Access for Infrastructure&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;With per-application and per-policy configuration, you can enforce PIV key authentication for sensitive usernames (for example, &lt;code&gt;root&lt;/code&gt;) while applying different requirements for other usernames. You can also set an MFA session duration to control how often users must re-authenticate.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;enrollment&quot;&gt;Enrollment&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#enrollment&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Users enroll their YubiKey PIV key through the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/app-launcher/&quot;&gt;App Launcher&lt;/a&gt;. For enrollment instructions and SSH client setup, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/independent-mfa/#enroll-a-piv-key-for-infrastructure-apps&quot;&gt;Enroll a PIV key for infrastructure apps&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;configuration&quot;&gt;Configuration&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#configuration&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;For setup instructions, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/mfa-requirements/#infrastructure-applications&quot;&gt;Enforce MFA for infrastructure applications&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Bots - New options to manage AI traffic</title><link>https://developers.cloudflare.com/changelog/post/2026-07-01-ai-traffic-options/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-01-ai-traffic-options/</guid><description>&lt;p&gt;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: &lt;a href=&quot;https://developers.cloudflare.com/bots/concepts/bot/#ai-bots&quot;&gt;Search, Agent, and Training&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;Each behavior maps to a real use case. &lt;strong&gt;Search&lt;/strong&gt; 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. &lt;strong&gt;Agent&lt;/strong&gt; covers automated activity acting in real time on a person&apos;s behalf, such as chat fetch bots and browser-use agents. &lt;strong&gt;Training&lt;/strong&gt; 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=4720,height=2966,format=webp/_astro/ai-bot-traffic-policies.BqXU7Gmv.png&quot; alt=&quot;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&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;4720&quot; height=&quot;2966&quot;&gt;
&lt;p&gt;Starting &lt;strong&gt;September 15, 2026&lt;/strong&gt;, new domains onboarding to Cloudflare receive updated defaults: Bots classified as Training or as Agent are blocked on pages that display ads, while &lt;strong&gt;Search&lt;/strong&gt; 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 &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/:zone/security/settings&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;opt out of the new defaults&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; at any time before September 15.&lt;/p&gt;</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><product>Bots</product><category>Bots</category></item><item><title>Bots - More visibility into bot traffic with BotBase and Attribution Business Insights</title><link>https://developers.cloudflare.com/changelog/post/2026-07-01-botbase-attribution-business-insights/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-01-botbase-attribution-business-insights/</guid><description>&lt;p&gt;With Content Independence Day 2026, &lt;a href=&quot;https://developers.cloudflare.com/bots/get-started/bot-management/&quot;&gt;Enterprise Bot Management&lt;/a&gt; customers get two new tools that make bot traffic far easier to see and reason about: &lt;a href=&quot;https://developers.cloudflare.com/bots/botbase/&quot;&gt;BotBase&lt;/a&gt;, a searchable directory of every bot Cloudflare tracks, and &lt;a href=&quot;https://developers.cloudflare.com/bots/attribution-business-insights/&quot;&gt;Attribution Business Insights&lt;/a&gt;, a dashboard that shows how much value each crawler sends back to your business.&lt;/p&gt;
&lt;p&gt;BotBase is Cloudflare&apos;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&apos;s detection ID to target it precisely in &lt;a href=&quot;https://developers.cloudflare.com/security/rules/&quot;&gt;Security rules&lt;/a&gt;. Every tracked bot in BotBase is also published in &lt;a href=&quot;https://radar.cloudflare.com/bots/directory&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Radar&apos;s bots and agents directory&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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&apos;s &lt;a href=&quot;https://developers.cloudflare.com/bots/concepts/bot/verified-bots/&quot;&gt;updated classification&lt;/a&gt; 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=8192,height=5064,format=webp/_astro/attribution-business-insights.Cu-ZtxkX.png&quot; alt=&quot;The Attribution Business Insights dashboard, showing bot traffic, content page requests, crawl-to-referral ratio, and a per-operator bot activity table&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;8192&quot; height=&quot;5064&quot;&gt;</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><product>Bots</product><category>Bots</category></item><item><title>Containers - Use Google Artifact Registry images with Containers</title><link>https://developers.cloudflare.com/changelog/post/2026-07-01-google-artifact-registry-images/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-01-google-artifact-registry-images/</guid><description>
&lt;p&gt;Containers now support &lt;a href=&quot;https://cloud.google.com/artifact-registry&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Google Artifact Registry&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; images. After you configure credentials, you can use a fully qualified Google Artifact Registry image reference in your &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/#containers&quot;&gt;Wrangler configuration&lt;/a&gt; instead of first pushing the image to Cloudflare Registry.&lt;/p&gt;
&lt;p&gt;Provide the service account email with &lt;code&gt;--gar-email&lt;/code&gt; and pipe the service account JSON key through &lt;code&gt;stdin&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;cat&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;PATH_TO_KE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;Y&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; registries&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; configure&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;REGIO&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;-docker.pkg.dev&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --gar-email=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;SERVICE_ACCOUNT_EMAIL&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --secret-name=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;SECRET_NAME&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;containers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;image&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;REGION&gt;-docker.pkg.dev/&amp;#x3C;PROJECT_ID&gt;/&amp;#x3C;REPOSITORY&gt;/&amp;#x3C;IMAGE&gt;:&amp;#x3C;TAG&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Example: us-central1-docker.pkg.dev/my-project/my-repo/my-image:latest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;image = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;REGION&gt;-docker.pkg.dev/&amp;#x3C;PROJECT_ID&gt;/&amp;#x3C;REPOSITORY&gt;/&amp;#x3C;IMAGE&gt;:&amp;#x3C;TAG&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;Only &lt;code&gt;*-docker.pkg.dev&lt;/code&gt; hosts are supported. To configure credentials, refer to &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/image-management/#use-private-google-artifact-registry-images&quot;&gt;Use private Google Artifact Registry images&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/image-management/&quot;&gt;Image management&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Cloudflare Images - Images binding is now billed per unique transformation</title><link>https://developers.cloudflare.com/changelog/post/2026-07-01-binding-unique-transformations/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-01-binding-unique-transformations/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/images/optimization/binding/&quot;&gt;Images binding&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Calls to &lt;a href=&quot;https://developers.cloudflare.com/images/optimization/binding/#infostream&quot;&gt;&lt;code&gt;.info()&lt;/code&gt;&lt;/a&gt; are no longer billed.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/images/pricing/#images-transformed&quot;&gt;Images pricing&lt;/a&gt; and the &lt;a href=&quot;https://developers.cloudflare.com/images/optimization/binding/&quot;&gt;Images binding documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><product>Cloudflare Images</product><category>Cloudflare Images</category></item><item><title>Vectorize - Reduced end-to-end latency for vector changes</title><link>https://developers.cloudflare.com/changelog/post/2026-06-30-improved-wal-throughput/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-30-improved-wal-throughput/</guid><description>&lt;p&gt;We have greatly improved the throughput of the Vectorize &lt;a href=&quot;https://blog.cloudflare.com/building-vectorize-a-distributed-vector-database-on-cloudflare-developer-platform/#the-wal&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;write-ahead log (WAL)&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. 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.&lt;/p&gt;
&lt;img src=&quot;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&quot; alt=&quot;Vectorize p99 WAL batch end-to-end latency improved&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2542&quot; height=&quot;1184&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/vectorize/&quot;&gt;Vectorize documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><product>Vectorize</product><category>Vectorize</category></item><item><title>WAF - WAF Release - 2026-07-01</title><link>https://developers.cloudflare.com/changelog/post/2026-07-01-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-07-01-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;32075e19b1494117ac5915e8d84c92c9&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d84c92c9&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Fortinet FortiSandbox - Path Traversal - CVE:CVE-2026-39813&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ae20608d93b94e97988db1bbc12cf9c8&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...c12cf9c8&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Anomaly:Header:User-Agent - Fake Bing or MSN Bot&lt;/td&gt;&lt;td&gt;Enabled&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;We are changing the action for this rule from BLOCK to Disabled&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Gateway, Cloudflare One, Cloudflare Fundamentals - New permissions and roles for Gateway policies and lists</title><link>https://developers.cloudflare.com/changelog/post/2026-06-30-gateway-granular-permissions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-30-gateway-granular-permissions/</guid><description>&lt;p&gt;You can now assign granular, resource-scoped roles for &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot;&gt;Cloudflare Gateway&lt;/a&gt; firewall policies and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/reusable-components/lists/&quot;&gt;Zero Trust lists&lt;/a&gt;. Administrators can delegate access to specific policy types or list management without granting account-wide or product-wide control.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-is-new&quot;&gt;What is new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-is-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When you &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/manage/&quot;&gt;add a member&lt;/a&gt; or create a &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/policies/&quot;&gt;permission policy&lt;/a&gt;, the following resource-scoped roles are now available:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Zero Trust Gateway Firewall Policies Admin&lt;/td&gt;
&lt;td&gt;Can view and edit all Gateway firewall policies, including DNS, HTTP, and Network policies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero Trust Gateway DNS Policies Admin&lt;/td&gt;
&lt;td&gt;Can view and edit Gateway DNS policies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero Trust Gateway HTTP Policies Admin&lt;/td&gt;
&lt;td&gt;Can view and edit Gateway HTTP policies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero Trust Gateway Network Policies Admin&lt;/td&gt;
&lt;td&gt;Can view and edit Gateway Network policies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero Trust Gateway Egress Policies Admin&lt;/td&gt;
&lt;td&gt;Can view and edit Gateway Egress policies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero Trust Gateway Resolver Policies Admin&lt;/td&gt;
&lt;td&gt;Can view and edit Gateway Resolver policies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero Trust Gateway Policies Admin&lt;/td&gt;
&lt;td&gt;Can view and edit all Gateway policies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero Trust Gateway Policies Read&lt;/td&gt;
&lt;td&gt;Can view all Gateway policies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero Trust Gateway Read Only&lt;/td&gt;
&lt;td&gt;Can view all Gateway resources.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero Trust DNS Locations Admin&lt;/td&gt;
&lt;td&gt;Can view and edit DNS locations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero Trust Proxy Endpoints Admin&lt;/td&gt;
&lt;td&gt;Can view and edit Gateway Proxy Endpoints.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero Trust Account Lists Admin&lt;/td&gt;
&lt;td&gt;Can view and edit all Gateway and Access lists.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zero Trust Account Lists Read&lt;/td&gt;
&lt;td&gt;Can view all Gateway and Access lists.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;These roles allow you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grant a network engineer write access to Network policies only, without exposing DNS or HTTP policy configuration.&lt;/li&gt;
&lt;li&gt;Allow a security analyst to view all Gateway policies in read-only mode for auditing purposes.&lt;/li&gt;
&lt;li&gt;Delegate list management to a team that maintains block and allow lists without giving them access to policy configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also now assign &lt;em&gt;Resource-scoped roles&lt;/em&gt;. 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. &lt;strong&gt;Existing account-level roles continue to work.&lt;/strong&gt; A member with the &lt;code&gt;Cloudflare Gateway&lt;/code&gt; or &lt;code&gt;Cloudflare Zero Trust&lt;/code&gt; role retains full access to all Gateway resources. This ensures backward compatibility for existing automation and API tokens.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Review the &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/roles/#resource-scoped-roles&quot;&gt;resource-scoped roles&lt;/a&gt; on the Cloudflare role reference.&lt;/li&gt;
&lt;li&gt;Learn how to &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/policies/&quot;&gt;create permission policies&lt;/a&gt; that use these roles.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category><category>Cloudflare One</category><category>Cloudflare Fundamentals</category></item><item><title>Logs - Account-scoped firewall events dataset in Logpush</title><link>https://developers.cloudflare.com/changelog/post/2026-06-30-account-level-firewall-events/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-30-account-level-firewall-events/</guid><description>&lt;p&gt;Cloudflare Logpush now supports &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/firewall_events/&quot;&gt;firewall events as an account-scoped dataset&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;The dataset includes a new &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/firewall_events/#zonename&quot;&gt;&lt;code&gt;ZoneName&lt;/code&gt;&lt;/a&gt; field so you can identify which zone each event came from when consuming logs in your downstream pipeline.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-available&quot;&gt;What&apos;s available&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-available&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;A new account-scoped &lt;code&gt;firewall_events&lt;/code&gt; dataset, configurable via the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/logpush/subresources/jobs/&quot;&gt;Logpush API&lt;/a&gt; or the Cloudflare dashboard.&lt;/li&gt;
&lt;li&gt;The same fields and filter expressions supported by the existing &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/zone/firewall_events/&quot;&gt;zone-scoped firewall events dataset&lt;/a&gt;, plus the new &lt;code&gt;ZoneName&lt;/code&gt; field.&lt;/li&gt;
&lt;li&gt;Support for all existing Logpush destinations.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>Workers, Durable Objects - Track memory usage for Workers and Durable Objects in the dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-06-30-memory-usage-metrics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-30-memory-usage-metrics/</guid><description>&lt;p&gt;You can now monitor how much memory your &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Workers&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt; consume across invocations with the new &lt;strong&gt;Memory Usage&lt;/strong&gt; chart in the Workers Metrics tab, broken down by P50, P90, P99, and P999 percentiles.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1210,height=782,format=webp/_astro/2026-06-26-memory-usage.B20y2uNp.png&quot; alt=&quot;Memory usage chart showing P50, P90, P99, and P999 percentiles with deployment markers&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1210&quot; height=&quot;782&quot;&gt;
&lt;p&gt;Memory usage measures the V8 &lt;a href=&quot;https://developers.cloudflare.com/workers/reference/how-workers-works/#isolates&quot;&gt;isolate&lt;/a&gt; memory at the time of each invocation, subject to the &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/limits/#memory&quot;&gt;128 MB per-isolate limit&lt;/a&gt; — a single isolate can handle many concurrent requests and shares memory across them.&lt;/p&gt;
&lt;p&gt;Use the Memory Usage chart to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Track memory trends&lt;/strong&gt; — Spot gradual increases that may indicate a memory leak before they cause &lt;code&gt;Exceeded Memory&lt;/code&gt; errors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Correlate with deployments&lt;/strong&gt; — Deployment markers on the chart help you identify whether a new version introduced a memory regression.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Right-size your Worker&lt;/strong&gt; — Understand your baseline memory footprint and how much headroom you have before hitting the 128 MB limit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/concepts/durable-object-lifecycle/&quot;&gt;hibernated or evicted&lt;/a&gt;. This state is not preserved across eviction, hibernation, or a crash, so persist anything important to &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/best-practices/access-durable-objects-storage/&quot;&gt;storage&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To view memory usage, open the &lt;strong&gt;Metrics&lt;/strong&gt; tab for your &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/services/view/:worker/production/metrics&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Worker&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; or &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/durable-objects&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Durable Object namespace&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. 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 &lt;a href=&quot;https://developers.cloudflare.com/analytics/graphql-api/tutorials/querying-workers-metrics/&quot;&gt;GraphQL Analytics API&lt;/a&gt; using the &lt;code&gt;workersInvocationsAdaptive&lt;/code&gt; dataset — the &lt;code&gt;quantiles.memoryUsageBytesP50&lt;/code&gt; through &lt;code&gt;quantiles.memoryUsageBytesP999&lt;/code&gt; fields return percentile values in bytes.&lt;/p&gt;
&lt;p&gt;For local memory debugging, you can also &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/dev-tools/memory-usage/&quot;&gt;profile memory with DevTools&lt;/a&gt; to take heap snapshots and identify specific objects causing high memory usage.&lt;/p&gt;</description><pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Durable Objects</category></item><item><title>Cloudflare One Client - Cloudflare One Client for Windows (version 2026.6.822.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-06-29-warp-windows-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-29-warp-windows-ga/</guid><description>&lt;p&gt;A new GA release for the Windows Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release introduces multiple features from our previous beta release into stable release, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The client now applies DNS search suffixes configured in your &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles&quot;&gt;device profile&lt;/a&gt; / &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies&quot;&gt;network policy&lt;/a&gt;. Administrators can push a list of DNS search domains that the client appends to single-label queries, alongside any system-configured suffixes. See &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#dns-search-suffixes&quot;&gt;DNS search suffixes&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://blog.cloudflare.com/mandatory-authentication-mfa/&quot;&gt;announcement blog&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/windows-no-auth-no-internet/&quot;&gt;documentation&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/hardware-backed-registration/&quot;&gt;Hardware-backed registration&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Added new warp-cli debug commands for interactive connection diagnosis. See &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/troubleshooting/diagnostic-logs/#extra-debug-logging&quot;&gt;Extra debug logging&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/parameters/#organization_configs&quot;&gt;Cloudflare One MDM documentation&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/client-version-assignments/&quot;&gt;Client version assignments&lt;/a&gt; for details.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Additional Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Starting with 2026.6.822.0, the client unifies all API requests under the &lt;code&gt;api.devices.cloudflare.com&lt;/code&gt; SNI, where previously both &lt;code&gt;zero-trust-client.cloudflareclient.com&lt;/code&gt; and &lt;code&gt;notifications.cloudflareclient.com&lt;/code&gt; were used. Review &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/firewall/&quot;&gt;Cloudflare One Client with firewall&lt;/a&gt; to ensure systems that rely on SNI inspection do not block the API traffic. The behavior of previous client versions is unaffected.&lt;/li&gt;
&lt;li&gt;Client Certificate device-posture checks now support template variables (e.g. &lt;code&gt;${serial_number}&lt;/code&gt;, &lt;code&gt;${device_uuid}&lt;/code&gt;) 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.&lt;/li&gt;
&lt;li&gt;Improved accessibility by using high contrast colors and more defined color boundaries when high contrast is enabled in Windows Accessibility settings.&lt;/li&gt;
&lt;li&gt;Path MTU Discovery (PMTUD) is now enabled by default.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Fixed an issue where DNS queries would fail after the connection was idle, requiring users to retry.&lt;/li&gt;
&lt;li&gt;Fixed a high CPU issue when the device wakes from sleep.&lt;/li&gt;
&lt;li&gt;Users can now register with team names in any case format without errors.&lt;/li&gt;
&lt;li&gt;New UI fixes&lt;ul&gt;
&lt;li&gt;Fixed an issue where users with invalid MDM configurations were returned to the onboarding screen after successful authentication.&lt;/li&gt;
&lt;li&gt;Added a re-auth button and banner to the home screen so users don&amp;#39;t miss it when their session expires.&lt;/li&gt;
&lt;li&gt;Added clear error messaging when the Cloudflare certificate needs to be installed.&lt;/li&gt;
&lt;li&gt;Brought back support for pausing the tunnel when connected to user-specified Wi-Fi networks for consumer users.&lt;/li&gt;
&lt;li&gt;New client UI now surfaces Split tunnel configuration and Local Domain Fallback configuration.&lt;/li&gt;
&lt;li&gt;Added ability to configure proxy mode for consumer users.&lt;/li&gt;
&lt;li&gt;Added back the option to quit for consumer users.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Single sign-on in the embedded WebView2 authentication browser may fail to use the Windows primary account, prompting for an interactive sign-in.&lt;/li&gt;
&lt;li&gt;An error indicating that Microsoft Edge can&amp;#39;t read and write to its data directory may be displayed during captive portal login; this error is benign and can be dismissed.&lt;/li&gt;
&lt;li&gt;In rare cases, a registration may hang at &amp;quot;Checking your organization configuration&amp;quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.&lt;/li&gt;
&lt;li&gt;Windows ARM may prompt the user to close running applications while trying to install this version. Simply click &amp;quot;Ok&amp;quot; with the default highlighted option.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Mon, 29 Jun 2026 20:05:45 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - Cloudflare One Client for macOS (version 2026.6.822.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-06-29-warp-macos-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-29-warp-macos-ga/</guid><description>&lt;p&gt;A new GA release for the macOS Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release introduces multiple features from our previous beta release into stable release, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The client now applies DNS search suffixes configured in your &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles&quot;&gt;device profile&lt;/a&gt; / &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies&quot;&gt;network policy&lt;/a&gt;. Administrators can push a list of DNS search domains that the client appends to single-label queries, alongside any system-configured suffixes. See &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#dns-search-suffixes&quot;&gt;DNS search suffixes&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/hardware-backed-registration/&quot;&gt;Hardware-backed registration&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Added new warp-cli debug commands for interactive connection diagnosis. See &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/troubleshooting/diagnostic-logs/#extra-debug-logging&quot;&gt;Extra debug logging&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/parameters/#organization_configs&quot;&gt;Cloudflare One MDM documentation&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/client-version-assignments/&quot;&gt;Client version assignments&lt;/a&gt; for details.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Additional Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Starting with 2026.6.822.0, the client unifies all API requests under the &lt;code&gt;api.devices.cloudflare.com&lt;/code&gt; SNI, where previously both &lt;code&gt;zero-trust-client.cloudflareclient.com&lt;/code&gt; and &lt;code&gt;notifications.cloudflareclient.com&lt;/code&gt; were used. Review &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/firewall/&quot;&gt;Cloudflare One Client with firewall&lt;/a&gt; to ensure systems that rely on SNI inspection do not block the API traffic. The behavior of previous client versions is unaffected.&lt;/li&gt;
&lt;li&gt;Client Certificate device-posture checks now support template variables (e.g. &lt;code&gt;${serial_number}&lt;/code&gt;, &lt;code&gt;${device_uuid}&lt;/code&gt;) 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.&lt;/li&gt;
&lt;li&gt;Improved accessibility by using high contrast colors and more defined color boundaries when high contrast is enabled in the macOS Display settings.&lt;/li&gt;
&lt;li&gt;Path MTU Discovery (PMTUD) is now enabled by default.&lt;/li&gt;
&lt;li&gt;Fixed the in-client captive-portal browser rendering a blank &amp;quot;Success&amp;quot; page on some airline Wi-Fi networks. The browser now more consistently loads the airline&amp;#39;s real portal page so users can complete sign-in from inside the client instead of having to open a separate browser.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Fixed an issue where DNS queries would fail after the connection was idle, requiring users to retry.&lt;/li&gt;
&lt;li&gt;Users can now register with team names in any case format without errors.&lt;/li&gt;
&lt;li&gt;New UI fixes&lt;ul&gt;
&lt;li&gt;Fixed an issue where users with invalid MDM configurations were returned to the onboarding screen after successful authentication.&lt;/li&gt;
&lt;li&gt;Added a re-auth button and banner to the home screen so users don&amp;#39;t miss it when their session expires.&lt;/li&gt;
&lt;li&gt;Added clear error messaging when the Cloudflare certificate needs to be installed.&lt;/li&gt;
&lt;li&gt;Brought back support for pausing the tunnel when connected to user-specified Wi-Fi networks for consumer users.&lt;/li&gt;
&lt;li&gt;New client UI now surfaces Split tunnel configuration and Local Domain Fallback configuration.&lt;/li&gt;
&lt;li&gt;Added ability to configure proxy mode for consumer users.&lt;/li&gt;
&lt;li&gt;Added back the option to quit for consumer users.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Registration may hang at &amp;quot;Checking your organization configuration&amp;quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.&lt;/li&gt;
&lt;li&gt;When deploying with Microsoft Intune, the client may be repeatedly reinstalled because Intune adds the client&amp;#39;s embedded framework bundles to its install-detection list, and those frameworks cannot be detected as installed on their own. See &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/troubleshooting/known-limitations/#repeated-reinstalls-on-macos-with-microsoft-intune&quot;&gt;Repeated reinstalls on macOS with Microsoft Intune&lt;/a&gt; for the workaround.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Mon, 29 Jun 2026 20:05:45 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - Cloudflare One Client for Linux (version 2026.6.822.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-06-29-warp-linux-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-29-warp-linux-ga/</guid><description>&lt;p&gt;A new GA release for the Linux Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release introduces multiple features from our previous beta release into stable release, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The client now applies DNS search suffixes configured in your &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles&quot;&gt;device profile&lt;/a&gt; / &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies&quot;&gt;network policy&lt;/a&gt;. Administrators can push a list of DNS search domains that the client appends to single-label queries, alongside any system-configured suffixes. See &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#dns-search-suffixes&quot;&gt;DNS search suffixes&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/hardware-backed-registration/&quot;&gt;Hardware-backed registration&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Added new warp-cli debug commands for interactive connection diagnosis. See &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/troubleshooting/diagnostic-logs/#extra-debug-logging&quot;&gt;Extra debug logging&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/parameters/#organization_configs&quot;&gt;Cloudflare One MDM documentation&lt;/a&gt; for details.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Additional changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Starting with 2026.6.822.0, the client unifies all API requests under the &lt;code&gt;api.devices.cloudflare.com&lt;/code&gt; SNI, where previously both &lt;code&gt;zero-trust-client.cloudflareclient.com&lt;/code&gt; and &lt;code&gt;notifications.cloudflareclient.com&lt;/code&gt; were used. Review &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/firewall/&quot;&gt;Cloudflare One Client with firewall&lt;/a&gt; to ensure systems that rely on SNI inspection do not block the API traffic. The behavior of previous client versions is unaffected.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;Cloudflare Mesh&lt;/a&gt; functionality using the Cloudflare One Client is now supported on RHEL 9 and 10.&lt;/li&gt;
&lt;li&gt;Cloudflare Mesh now supports &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#hostname-routes&quot;&gt;hostname-based routing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Client Certificate device-posture checks now support template variables (e.g. &lt;code&gt;${serial_number}&lt;/code&gt;, &lt;code&gt;${device_uuid}&lt;/code&gt;) 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.&lt;/li&gt;
&lt;li&gt;Improved accessibility by using high contrast colors and more defined color boundaries when high contrast is enabled in the system display settings.&lt;/li&gt;
&lt;li&gt;Path MTU Discovery (PMTUD) is now enabled by default.&lt;/li&gt;
&lt;li&gt;Fixed the in-client captive-portal browser rendering a blank &amp;quot;Success&amp;quot; page on some airline Wi-Fi networks. The browser now more consistently loads the airline&amp;#39;s real portal page so users can complete sign-in from inside the client instead of having to open a separate browser.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Fixed an issue where DNS queries would fail after the connection was idle, requiring users to retry.&lt;/li&gt;
&lt;li&gt;Fixed an issue where some Debian releases experienced inaccurate version reporting for posture checks.&lt;/li&gt;
&lt;li&gt;Users can now register with team names in any case format without errors.&lt;/li&gt;
&lt;li&gt;New UI fixes&lt;ul&gt;
&lt;li&gt;Fixed an issue where users with invalid MDM configurations were returned to the onboarding screen after successful authentication.&lt;/li&gt;
&lt;li&gt;Added a re-auth button and banner to the home screen so users don&amp;#39;t miss it when their session expires.&lt;/li&gt;
&lt;li&gt;Added clear error messaging when the Cloudflare certificate needs to be installed.&lt;/li&gt;
&lt;li&gt;Brought back support for pausing the tunnel when connected to user-specified Wi-Fi networks for consumer users.&lt;/li&gt;
&lt;li&gt;New client UI now surfaces Split tunnel configuration and Local Domain Fallback configuration.&lt;/li&gt;
&lt;li&gt;Added ability to configure proxy mode for consumer users.&lt;/li&gt;
&lt;li&gt;Added back the option to quit for consumer users.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For RHEL deployments, this release introduces a dependency on the &lt;a href=&quot;https://docs.fedoraproject.org/en-US/epel/&quot;&gt;Extra Packages for Enterprise Linux&lt;/a&gt; repository (EPEL). The EPEL repository provides packages that support the captive portal detection’s in-app browser authentication and system tray icon. See &lt;a href=&quot;https://docs.fedoraproject.org/en-US/epel/getting-started/&quot;&gt;Getting started with EPEL&lt;/a&gt; for instructions on enabling EPEL.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Registration may hang at &amp;quot;Checking your organization configuration&amp;quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Mon, 29 Jun 2026 19:21:09 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Workers - Workers fetch requests now support cf.vary</title><link>https://developers.cloudflare.com/changelog/post/2026-06-28-cf-vary-request-option/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-28-cf-vary-request-option/</guid><description>
&lt;p&gt;Workers &lt;code&gt;fetch()&lt;/code&gt; requests now support the &lt;code&gt;cf.vary&lt;/code&gt; request option. Use &lt;code&gt;cf.vary&lt;/code&gt; to control how Cloudflare caches origin responses with a &lt;code&gt;Vary&lt;/code&gt; header for a single subrequest.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			cf: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				vary: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					default: { action: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bypass&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					headers: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						accept: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							action: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;normalize&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							media_types: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text/html&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;						&quot;accept-language&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							action: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;normalize&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							languages: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;fr&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;de&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			cf: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				vary: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					default: { action: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bypass&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					headers: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						accept: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							action: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;normalize&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							media_types: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text/html&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;						&quot;accept-language&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							action: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;normalize&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;							languages: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;en&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;fr&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;de&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExportedHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/request/#the-cfvary-property&quot;&gt;&lt;code&gt;cf.vary&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Agents, Workers - Agents SDK adds background sub-agents and a unified turn entry point</title><link>https://developers.cloudflare.com/changelog/post/2026-06-26-agents-sdk-v0.17.0/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-26-agents-sdk-v0.17.0/</guid><description>
&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;This release adds first-class detached (background) sub-agent runs with live progress and durable milestones, a single &lt;code&gt;runTurn&lt;/code&gt; turn-admission entry point, and a large round of recovery and reliability fixes that continue converging &lt;code&gt;@cloudflare/think&lt;/code&gt; and &lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; onto one model.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;background-sub-agents-with-progress-and-milestones&quot;&gt;Background sub-agents with progress and milestones&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#background-sub-agents-with-progress-and-milestones&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;runAgentTool&lt;/code&gt; 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.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; OrdersAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; startImport&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Fire-and-forget, or wire a durable completion callback&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// (by method name, like schedule()):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runAgentTool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(ImportAgent, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			input,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			detached: { onFinish: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;onImportDone&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, maxBudgetMs: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 60&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// result.status: &quot;completed&quot; | &quot;error&quot; | &quot;aborted&quot; | &quot;interrupted&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onImportDone&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; OrdersAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; startImport&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Fire-and-forget, or wire a durable completion callback&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// (by method name, like schedule()):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runAgentTool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(ImportAgent, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			input,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			detached: { onFinish: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;onImportDone&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, maxBudgetMs: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 60&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// result.status: &quot;completed&quot; | &quot;error&quot; | &quot;aborted&quot; | &quot;interrupted&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onImportDone&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;Highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Durable, exactly-once-on-the-happy-path completion&lt;/strong&gt; via a warm fast path plus a self-scheduling reconcile backbone that survives eviction and deploys.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bounded.&lt;/strong&gt; An absolute &lt;code&gt;maxBudgetMs&lt;/code&gt; ceiling (default 24h) and &lt;code&gt;cancelAgentTool(runId)&lt;/code&gt; keep abandoned runs from holding a concurrency slot forever.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;detached: { notify: true }&lt;/code&gt;&lt;/strong&gt; lets a finished background run inject a message back into the chat so the model reacts to the result — no hand-wired &lt;code&gt;onFinish&lt;/code&gt; needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sub-agents can also report mid-run progress that rides their own turn stream back to the parent&apos;s connected clients:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Inside the child sub-agent:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;reportProgress&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	fraction: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0.6&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	phase: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;deploying&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	message: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Generating menu page…&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Inside the child sub-agent:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;reportProgress&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	fraction: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0.6&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	phase: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;deploying&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	message: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Generating menu page…&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Progress surfaces on &lt;code&gt;AgentToolRunState.progress&lt;/code&gt; via &lt;code&gt;useAgentToolEvents&lt;/code&gt;, 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 &lt;code&gt;milestone&lt;/code&gt; promotes a signal to a durable, replayable row, and &lt;code&gt;detached: { onMilestones }&lt;/code&gt; can surface a milestone as a synthetic chat message (&lt;code&gt;&quot;narrate&quot;&lt;/code&gt; for a cheap status line, or &lt;code&gt;&quot;react&quot;&lt;/code&gt; to drive a model turn).&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;one-entry-point-for-turns-runturn&quot;&gt;One entry point for turns: &lt;code&gt;runTurn&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#one-entry-point-for-turns-runturn&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/think&lt;/code&gt; adds a public &lt;code&gt;runTurn(options)&lt;/code&gt; facade that unifies turn admission behind a single &lt;code&gt;mode&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;wait&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, messages }); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// saveMessages / continueLastTurn&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;submit&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, messages }); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// durable submitMessages&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;stream&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, messages }); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// chat()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;wait&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, messages }); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// saveMessages / continueLastTurn&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;submit&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, messages }); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// durable submitMessages&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;stream&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, messages }); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// chat()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;stream&lt;/code&gt; mode accepts array and function inputs to match &lt;code&gt;wait&lt;/code&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;recovery-and-reliability&quot;&gt;Recovery and reliability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#recovery-and-reliability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A large part of this release continues hardening recovery and converging &lt;code&gt;@cloudflare/think&lt;/code&gt; and &lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; onto one model:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stream stall watchdog.&lt;/strong&gt; &lt;code&gt;AIChatAgent&lt;/code&gt; can detect and recover from a hung model/transport stream via the opt-in &lt;code&gt;chatStreamStallTimeoutMs&lt;/code&gt; watchdog. With &lt;code&gt;chatRecovery&lt;/code&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interrupted tool-call repair.&lt;/strong&gt; &lt;code&gt;AIChatAgent&lt;/code&gt; now repairs a transcript with a dead server-tool call before re-entering inference (parity with &lt;code&gt;@cloudflare/think&lt;/code&gt;), so a recovered turn no longer fails with &lt;code&gt;AI_MissingToolResultsError&lt;/code&gt;. An overridable &lt;code&gt;repairInterruptedToolPart(part)&lt;/code&gt; hook lets apps customize the repaired shape.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stuck status after reconnect.&lt;/strong&gt; Fixed AI SDK &lt;code&gt;status&lt;/code&gt; 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 &lt;code&gt;ready&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live &quot;recovering…&quot; on connect.&lt;/strong&gt; &lt;code&gt;AIChatAgent&lt;/code&gt; now replays the recovering status to a client that connects mid-recovery, so &lt;code&gt;useAgentChat&lt;/code&gt;&apos;s &lt;code&gt;isRecovering&lt;/code&gt; reflects in-progress recovery immediately instead of appearing frozen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terminal connection failures.&lt;/strong&gt; The client stops reconnecting on terminal WebSocket close events and exposes them via &lt;code&gt;connectionError&lt;/code&gt; / &lt;code&gt;onConnectionError&lt;/code&gt; on &lt;code&gt;AgentClient&lt;/code&gt;, &lt;code&gt;useAgent&lt;/code&gt;, and &lt;code&gt;useAgentChat&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent-tool child recovery.&lt;/strong&gt; A healthy long-running sub-agent run is no longer abandoned as &lt;code&gt;interrupted&lt;/code&gt; after a deploy (both &lt;code&gt;@cloudflare/think&lt;/code&gt; and &lt;code&gt;AIChatAgent&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workflows from sub-agent facets.&lt;/strong&gt; Agent Workflows can now start from sub-agent facets, with callbacks and Workflow RPC routed back to the originating facet.&lt;/li&gt;
&lt;li&gt;Plus forward-progress crediting convergence, broadcast-first give-up ordering, an event-driven auto-continuation barrier, and structured row-size compaction in &lt;code&gt;AIChatAgent&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;other-improvements&quot;&gt;Other improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#other-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shared chat React core.&lt;/strong&gt; A new &lt;code&gt;agents/chat/react&lt;/code&gt; entry exposes &lt;code&gt;useAgentChat&lt;/code&gt;, transport helpers, and shared wire types, with &lt;code&gt;syncMessagesToServer&lt;/code&gt; for server-authoritative transcript storage. &lt;code&gt;@cloudflare/think/react&lt;/code&gt; and &lt;code&gt;@cloudflare/ai-chat/react&lt;/code&gt; are now thin wrappers over it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optional &lt;code&gt;ai&lt;/code&gt; peer.&lt;/strong&gt; The root &lt;code&gt;agents&lt;/code&gt; and &lt;code&gt;@cloudflare/codemode&lt;/code&gt; runtimes no longer reference AI SDK types, so they bundle without &lt;code&gt;ai&lt;/code&gt; / &lt;code&gt;zod&lt;/code&gt; installed; AI-specific entry points still require the peer when imported. &lt;code&gt;just-bash&lt;/code&gt; likewise moves to an optional peer used only by the skills bash runner.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Code Mode.&lt;/strong&gt; The default &lt;code&gt;DynamicWorkerExecutor&lt;/code&gt; 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 &lt;code&gt;openApiMcpServer&lt;/code&gt; request callbacks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Voice.&lt;/strong&gt; Voice turns now support AI SDK &lt;code&gt;fullStream&lt;/code&gt; responses (and warn when &lt;code&gt;textStream&lt;/code&gt; is used).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP.&lt;/strong&gt; &lt;code&gt;McpAgent&lt;/code&gt; server-to-client requests can now be sent from callbacks that do not inherit the agent&apos;s async context, including callbacks reached through Worker Loader RPC.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Experimental: server actions and channels.&lt;/strong&gt; This release lays groundwork for guarded server actions (&lt;code&gt;action()&lt;/code&gt; / &lt;code&gt;getActions()&lt;/code&gt; with a durable replay ledger and approvals) and a unified channels surface (&lt;code&gt;configureChannels()&lt;/code&gt;, &lt;code&gt;deliverNotice()&lt;/code&gt;). Both are experimental and their APIs may change, so we don&apos;t recommend depending on them yet.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-npm&quot; id=&quot;pm-tab-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-npm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-yarn&quot; id=&quot;pm-tab-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-yarn&quot; data-nb-pm-tab class=&quot;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&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-pnpm&quot; id=&quot;pm-tab-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-pnpm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-bun&quot; id=&quot;pm-tab-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-bun&quot; data-nb-pm-tab class=&quot;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&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-npm&quot; aria-labelledby=&quot;pm-tab-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-yarn&quot; aria-labelledby=&quot;pm-tab-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-bun&quot; aria-labelledby=&quot;pm-tab-pm-830aac94-d6cd-41f1-88c6-e715b5f15e59-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest @cloudflare/codemode@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/agents/harnesses/think/&quot;&gt;Think documentation&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/agents/tools/codemode/&quot;&gt;Code Mode documentation&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/agents/&quot;&gt;Agents documentation&lt;/a&gt; for more information.&lt;/p&gt;</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Cloudflare One, Access - Service token support for MCP server portals</title><link>https://developers.cloudflare.com/changelog/post/2026-06-26-mcp-portal-service-tokens/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-26-mcp-portal-service-tokens/</guid><description>&lt;p&gt;You can now connect autonomous agents and bots to an &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/&quot;&gt;MCP server portal&lt;/a&gt; using an &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/service-credentials/service-tokens/&quot;&gt;Access service token&lt;/a&gt;. Service token sessions can reach upstream MCP servers through the portal without a browser-based OAuth flow.&lt;/p&gt;
&lt;p&gt;To set this up:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/#service-auth&quot;&gt;Service Auth policy&lt;/a&gt; that matches your service token to the portal&apos;s Access application.&lt;/li&gt;
&lt;li&gt;Add a Service Auth policy that matches the same token to each linked MCP server&apos;s Access application.&lt;/li&gt;
&lt;li&gt;Turn &lt;strong&gt;Require user auth&lt;/strong&gt; off (&lt;code&gt;on_behalf: false&lt;/code&gt;) for each linked server so the portal uses the admin credential instead of a per-user OAuth grant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The bot connects with &lt;code&gt;CF-Access-Client-Id&lt;/code&gt; and &lt;code&gt;CF-Access-Client-Secret&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;For step-by-step setup, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#connect-with-a-service-token&quot;&gt;Connect with a service token&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category><category>Access</category></item><item><title>Durable Objects, Workers - New `us` jurisdiction for Durable Objects</title><link>https://developers.cloudflare.com/changelog/post/2026-06-26-durable-objects-us-jurisdiction/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-26-durable-objects-us-jurisdiction/</guid><description>&lt;p&gt;Durable Objects now supports a &lt;code&gt;us&lt;/code&gt; &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/reference/data-location/#restrict-durable-objects-to-a-jurisdiction&quot;&gt;jurisdiction&lt;/a&gt;, letting you create Durable Objects that only run and store data within the United States. Use the &lt;code&gt;us&lt;/code&gt; jurisdiction when you need to keep a Durable Object&apos;s compute and storage inside the United States to meet data residency requirements.&lt;/p&gt;
&lt;p&gt;Create a namespace restricted to the &lt;code&gt;us&lt;/code&gt; jurisdiction the same way as any other jurisdiction:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Worker&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; usSubnamespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_DURABLE_OBJECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;jurisdiction&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;us&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stub&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; usSubnamespace.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getByName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;general&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stub.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Workers may still access Durable Objects constrained to the &lt;code&gt;us&lt;/code&gt; jurisdiction from anywhere in the world. The jurisdiction constraint only controls where the Durable Object itself runs and persists data.&lt;/p&gt;
&lt;p&gt;For the full list of supported jurisdictions, refer to &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/reference/data-location/#restrict-durable-objects-to-a-jurisdiction&quot;&gt;Data location — Restrict Durable Objects to a jurisdiction&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Cloudflare Fundamentals - Search API tokens by name</title><link>https://developers.cloudflare.com/changelog/post/2026-06-25-api-token-search/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-25-api-token-search/</guid><description>&lt;p&gt;You can now search API tokens by name, making it easier to find specific tokens across large token lists without manually paginating.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dashboard search&lt;/strong&gt;: Both &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/account-api-tokens&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;account API tokens&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://dash.cloudflare.com/profile/api-tokens&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;user API tokens&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; pages now include a search bar. Type a name to filter results.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API search support&lt;/strong&gt;: The &lt;a href=&quot;https://developers.cloudflare.com/api/resources/user/subresources/tokens/methods/list/&quot;&gt;&lt;code&gt;/user/tokens&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/api/resources/accounts/subresources/tokens/methods/list/&quot;&gt;&lt;code&gt;/accounts/{account_id}/tokens&lt;/code&gt;&lt;/a&gt; endpoints now accept a &lt;code&gt;name&lt;/code&gt; query parameter to filter tokens by name.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/get-started/create-token/&quot;&gt;Create an API token&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/get-started/account-owned-tokens/&quot;&gt;Account API tokens&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Durable Objects, Workers - Test Durable Object eviction with new cloudflare:test helpers</title><link>https://developers.cloudflare.com/changelog/post/2026-06-25-durable-object-eviction-test-helpers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-25-durable-object-eviction-test-helpers/</guid><description>&lt;p&gt;The &lt;code&gt;@cloudflare/vitest-pool-workers&lt;/code&gt; package now includes &lt;code&gt;evictDurableObject&lt;/code&gt; and &lt;code&gt;evictAllDurableObjects&lt;/code&gt; test helpers, exported from &lt;code&gt;cloudflare:test&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For more context, refer to &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/concepts/durable-object-lifecycle/&quot;&gt;Lifecycle of a Durable Object&lt;/a&gt;.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { evictDurableObject, evictAllDurableObjects } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:test&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { env } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNTER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;idFromName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-counter&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stub&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNTER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(id);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Evict the Durable Object instance pointed to by a specific stub&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; evictDurableObject&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(stub);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Close WebSockets instead of hibernating them&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; evictDurableObject&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(stub, { webSockets: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;close&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Evict all currently-running Durable Objects in evictable namespaces&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; evictAllDurableObjects&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;These helpers are available in &lt;code&gt;@cloudflare/vitest-pool-workers@0.16.20&lt;/code&gt; and later.&lt;/p&gt;
&lt;p&gt;Learn more in the &lt;a href=&quot;https://developers.cloudflare.com/workers/testing/vitest-integration/test-apis/#durable-objects&quot;&gt;Test APIs reference&lt;/a&gt; and the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/examples/testing-with-durable-objects/#testing-eviction&quot;&gt;Testing Durable Objects guide&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 25 Jun 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Cloudflare One Client - Cloudflare One Client for macOS (version 2026.6.782.1)</title><link>https://developers.cloudflare.com/changelog/post/2026-06-24-warp-macos-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-24-warp-macos-beta/</guid><description>&lt;p&gt;A new Beta release for the macOS Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/&quot;&gt;beta releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Additional changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This release also introduces multiple fixes and improvements including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improved accessibility by using high contrast colors and more defined color boundaries when high contrast is enabled in the macOS Display settings.&lt;/li&gt;
&lt;li&gt;Path MTU Discovery (PMTUD) is now enabled by default.&lt;/li&gt;
&lt;li&gt;Fixed an issue where DNS queries would fail after the connection was idle, requiring users to retry.&lt;/li&gt;
&lt;li&gt;Users can now register with team names in any case format without errors.&lt;/li&gt;
&lt;li&gt;New UI fixes&lt;ul&gt;
&lt;li&gt;Fixed an issue where users with invalid MDM configurations were returned to the onboarding screen after successful authentication.&lt;/li&gt;
&lt;li&gt;Added a re-auth button and banner to the home screen so users don&amp;#39;t miss it when their session expires.&lt;/li&gt;
&lt;li&gt;Added clear error messaging when the Cloudflare certificate needs to be installed.&lt;/li&gt;
&lt;li&gt;Brought back support for pausing the tunnel when connected to user-specified Wi-Fi networks for consumer users.&lt;/li&gt;
&lt;li&gt;New client UI now surfaces Split tunnel configuration and Local Domain Fallback configuration.&lt;/li&gt;
&lt;li&gt;Added ability to configure proxy mode for consumer users.&lt;/li&gt;
&lt;li&gt;Added back the option to quit for consumer users.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Registration may hang at &amp;quot;Checking your organization configuration&amp;quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Wed, 24 Jun 2026 18:35:32 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>AI Search - Control AI Search similarity cache freshness</title><link>https://developers.cloudflare.com/changelog/post/2026-06-24-ai-search-similarity-cache-controls/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-24-ai-search-similarity-cache-controls/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now gives you more control over &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/retrieval/cache/&quot;&gt;similarity cache&lt;/a&gt; freshness. Similarity cache helps reduce latency and inference cost by reusing responses for semantically similar queries.&lt;/p&gt;
&lt;p&gt;With these updates, you can choose how long responses are eligible for reuse and clear cached responses when they may be stale.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cache-duration-now-defaults-to-48-hours&quot;&gt;Cache duration now defaults to 48 hours&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cache-duration-now-defaults-to-48-hours&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Previously, AI Search cached responses for a fixed duration of 30 days. Cached responses now use the instance&apos;s &lt;code&gt;cache_ttl&lt;/code&gt; setting, and the default is &lt;strong&gt;48 hours&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You can set &lt;code&gt;cache_ttl&lt;/code&gt; when creating or updating an instance to choose a cache duration from 10 minutes to 6 days.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For example, set &lt;code&gt;cache_ttl&lt;/code&gt; to &lt;code&gt;518400&lt;/code&gt; to retain cached responses for 6 days:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;cache_ttl&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;518400&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;purge-cached-responses&quot;&gt;Purge cached responses&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#purge-cached-responses&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can also purge all cached responses for an instance on demand. Purging cached responses does not delete indexed content or source files.&lt;/p&gt;
&lt;p&gt;It prevents AI Search from reusing previous cached responses, so subsequent similar queries generate fresh answers and repopulate the cache.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/ai-search/instances/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$INSTANCE_NAME&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/purge_cache&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;You can also purge cached responses from the instance settings page in the Cloudflare dashboard.&lt;/p&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/retrieval/cache/&quot;&gt;similarity cache&lt;/a&gt; for the full list of supported &lt;code&gt;cache_ttl&lt;/code&gt; values and more details about cache behavior.&lt;/p&gt;</description><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Audit Logs - Audit Logs v2 — Organization-level audit logs in Cloudflare dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-06-24-audit-logs-v2-organization-dashboard-ui/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-24-audit-logs-v2-organization-dashboard-ui/</guid><description>&lt;p&gt;You can now, as an &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/organizations/&quot;&gt;Organization&lt;/a&gt; Super Administrator, view organization-level &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/&quot;&gt;audit logs&lt;/a&gt; in the Cloudflare dashboard, in addition to the existing &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/#organization-activity-logs&quot;&gt;API access&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3450,height=1738,format=webp/_astro/Audit_logs_v2_organization_dashboard.De-uwPva.png&quot; alt=&quot;Organization audit logs in the Cloudflare dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3450&quot; height=&quot;1738&quot;&gt;
&lt;p&gt;If you are viewing account-level audit logs and the account belongs to an organization where you are an Organization Super Administrator, select &lt;strong&gt;View Organization Audit Logs&lt;/strong&gt; to open the parent organization&apos;s audit logs.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3456,height=510,format=webp/_astro/Audit_logs_v2_view_organization_button.Ch7CaBB-.png&quot; alt=&quot;View Organization Audit Logs button&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3456&quot; height=&quot;510&quot;&gt;
&lt;p&gt;To get started, go to &lt;strong&gt;Organizations&lt;/strong&gt;, select your organization, then go to &lt;strong&gt;Manage Organization&lt;/strong&gt; &amp;gt; &lt;strong&gt;Audit Logs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/&quot;&gt;Audit Logs documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate><product>Audit Logs</product><category>Audit Logs</category></item><item><title>Logs - New WebSocket Analytics Logpush dataset and updated fields</title><link>https://developers.cloudflare.com/changelog/post/2026-06-24-log-fields-updated/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-24-log-fields-updated/</guid><description>&lt;p&gt;Cloudflare has updated &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/&quot;&gt;Logpush datasets&lt;/a&gt;:&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-datasets&quot;&gt;New datasets&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-datasets&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WebSocket Analytics&lt;/strong&gt;: A new dataset with fields including &lt;code&gt;BytesReceivedClient&lt;/code&gt;, &lt;code&gt;BytesReceivedOrigin&lt;/code&gt;, &lt;code&gt;BytesSentClient&lt;/code&gt;, &lt;code&gt;BytesSentOrigin&lt;/code&gt;, &lt;code&gt;ClientASN&lt;/code&gt;, &lt;code&gt;ClientIP&lt;/code&gt;, &lt;code&gt;ClientRequestHost&lt;/code&gt;, &lt;code&gt;ClientRequestPath&lt;/code&gt;, &lt;code&gt;ClientRequestUserAgent&lt;/code&gt;, &lt;code&gt;ColoCode&lt;/code&gt;, &lt;code&gt;ConnectionCloseReason&lt;/code&gt;, &lt;code&gt;ConnectionCloseSource&lt;/code&gt;, &lt;code&gt;ConnectionID&lt;/code&gt;, &lt;code&gt;ConnectionTransportCloseCode&lt;/code&gt;, &lt;code&gt;EdgeEndTimestamp&lt;/code&gt;, &lt;code&gt;EdgeStartTimestamp&lt;/code&gt;, and &lt;code&gt;RayID&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;updated-fields-in-existing-datasets&quot;&gt;Updated fields in existing datasets&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#updated-fields-in-existing-datasets&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Firewall events&lt;/strong&gt; (added): &lt;code&gt;ZoneName&lt;/code&gt;. The Firewall events dataset is now also available for &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/firewall_events/&quot;&gt;account-scope Logpush&lt;/a&gt;, in addition to the existing zone scope.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Email Security Alerts&lt;/strong&gt; (added): &lt;code&gt;BCC&lt;/code&gt;, &lt;code&gt;DKIMResult&lt;/code&gt;, &lt;code&gt;DMARCPolicy&lt;/code&gt;, &lt;code&gt;DMARCResult&lt;/code&gt;, and &lt;code&gt;SPFResult&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the complete field definitions for each dataset, refer to &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/&quot;&gt;Logpush datasets&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>Radar - Precise IP location and richer AS details on the Cloudflare Radar IP page</title><link>https://developers.cloudflare.com/changelog/post/2026-06-24-radar-ip-page-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-24-radar-ip-page-improvements/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; now plots your IPv4 and IPv6 locations on the &lt;a href=&quot;https://radar.cloudflare.com/ip&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;IP page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, shows the Cloudflare data centers serving your connection, and includes more detail about the autonomous system (AS) your primary IP belongs to.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;your-ip-location-on-the-map&quot;&gt;Your IP location on the map&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#your-ip-location-on-the-map&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The map of your connection now shows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IP location markers&lt;/strong&gt; — 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare data center markers&lt;/strong&gt; — Cloudflare data centers now show as orange dots on the map and the one you are connected to is highlighted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data center connectors&lt;/strong&gt; — Each line connects your IP markers to their respective data centers.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3136,height=1305,format=webp/_astro/ip-page-geolocation.BJ53oUtj.png&quot; alt=&quot;Map showing Cloudflare data centers and a marker representing the IP location with a line connected to a data center&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3136&quot; height=&quot;1305&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;extended-as-information&quot;&gt;Extended AS information&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#extended-as-information&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://radar.cloudflare.com/ip&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Radar IP page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to explore more details about your IP.&lt;/p&gt;</description><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Workflows - Workflows rollback handlers now include step context</title><link>https://developers.cloudflare.com/changelog/post/2026-06-16-rollback-options/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-16-rollback-options/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt; makes it easier to build reliable multi-step applications that can recover when downstream systems fail. Rollback handlers now receive the original &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/step-context/&quot;&gt;step context&lt;/a&gt; via a &lt;code&gt;ctx&lt;/code&gt; object for the step being rolled back. This includes &lt;code&gt;ctx.step.name&lt;/code&gt;, &lt;code&gt;ctx.step.count&lt;/code&gt;, &lt;code&gt;ctx.attempt&lt;/code&gt;, and the step &lt;code&gt;config&lt;/code&gt; with defaults applied.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/workers-api/#workflowstepconfig&quot;&gt;step configuration&lt;/a&gt; includes the retry and timeout settings used for that step, so you can customize your step recovery logic according to those fields.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;create charge&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; charge&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createCharge&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { chargeId: charge.id };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		rollback&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;			// `output` is the value returned by the step being rolled back.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;chargeId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; output &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;chargeId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; refundCharge&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(chargeId, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;				// `ctx` is the original step context, including step name, count, attempt, and config.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				reason: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		rollbackConfig: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;			// `rollbackConfig` controls retries and timeout for the rollback handler.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			retries: { limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, delay: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;30 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, backoff: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;linear&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;5 minutes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/workers-api/#rollback-options&quot;&gt;rollback options&lt;/a&gt; to learn more.&lt;/p&gt;</description><pubDate>Tue, 23 Jun 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>Data Localization Suite - Regionalized IP Bindings for Regional Services</title><link>https://developers.cloudflare.com/changelog/post/2026-06-23-regionalized-ip-bindings/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-23-regionalized-ip-bindings/</guid><description>&lt;p&gt;Regional Services now supports &lt;strong&gt;Regionalized IP Bindings&lt;/strong&gt;, letting you regionalize traffic at the IP layer for prefixes you bring to Cloudflare through &lt;a href=&quot;https://developers.cloudflare.com/byoip/&quot;&gt;Bring Your Own IP (BYOIP)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Where &lt;a href=&quot;https://developers.cloudflare.com/data-localization/regional-services/regional-hostnames/&quot;&gt;Regional Hostnames&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Regionalized IP Bindings requires the Regional Services and Regional Services for BYOIP entitlements. Contact your account team to enable them.&lt;/p&gt;
&lt;p&gt;To get started, refer to &lt;a href=&quot;https://developers.cloudflare.com/data-localization/regional-services/ip-bindings/&quot;&gt;Regionalized IP Bindings&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate><product>Data Localization Suite</product><category>Data Localization Suite</category></item><item><title>Speed - Cloudflare AMP/SXG is now end of life.</title><link>https://developers.cloudflare.com/changelog/post/2026-06-23-amp-sxg-end-of-life/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-23-amp-sxg-end-of-life/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</description><pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate><product>Speed</product><category>Speed</category></item><item><title>WAF - WAF Release - 2026-06-23</title><link>https://developers.cloudflare.com/changelog/post/2026-06-23-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-23-waf-release/</guid><description>
&lt;p&gt;This week&apos;s release introduces new managed protection to address a critical pre-authentication OS command injection vulnerability in Ivanti Sentry (CVE-2026-10520).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;500a90789f874345b60b0de7242fdf83&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...242fdf83&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Ivanti Sentry - Command Injection - CVE:CVE-2026-10520&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>R2 SQL - R2 SQL now supports window functions, DISTINCT, and set operations</title><link>https://developers.cloudflare.com/changelog/post/2026-06-21-window-functions-distinct-set-operations/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-21-window-functions-distinct-set-operations/</guid><description>&lt;p&gt;R2 SQL now supports window functions, &lt;code&gt;SELECT DISTINCT&lt;/code&gt;, set operations, and additional aggregates, making it easier to write analytical queries without preprocessing your data elsewhere.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; is Cloudflare&apos;s serverless, distributed SQL engine for querying &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables stored in &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-capabilities&quot;&gt;New capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Window functions&lt;/strong&gt; — &lt;code&gt;ROW_NUMBER&lt;/code&gt;, &lt;code&gt;RANK&lt;/code&gt;, &lt;code&gt;DENSE_RANK&lt;/code&gt;, &lt;code&gt;PERCENT_RANK&lt;/code&gt;, &lt;code&gt;CUME_DIST&lt;/code&gt;, &lt;code&gt;NTILE&lt;/code&gt;, &lt;code&gt;LAG&lt;/code&gt;, &lt;code&gt;LEAD&lt;/code&gt;, &lt;code&gt;FIRST_VALUE&lt;/code&gt;, &lt;code&gt;LAST_VALUE&lt;/code&gt;, &lt;code&gt;NTH_VALUE&lt;/code&gt;, and aggregates with an &lt;code&gt;OVER (...)&lt;/code&gt; clause, including &lt;code&gt;PARTITION BY&lt;/code&gt; and explicit frames&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QUALIFY&lt;/strong&gt; — filter rows based on a window function result&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DISTINCT&lt;/strong&gt; — &lt;code&gt;SELECT DISTINCT&lt;/code&gt;, &lt;code&gt;DISTINCT ON (...)&lt;/code&gt;, and the &lt;code&gt;DISTINCT&lt;/code&gt; modifier on aggregates such as &lt;code&gt;COUNT(DISTINCT ...)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Set operations&lt;/strong&gt; — &lt;code&gt;UNION&lt;/code&gt;, &lt;code&gt;UNION ALL&lt;/code&gt;, &lt;code&gt;INTERSECT&lt;/code&gt;, and &lt;code&gt;EXCEPT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grouping extensions&lt;/strong&gt; — &lt;code&gt;GROUPING SETS&lt;/code&gt;, &lt;code&gt;ROLLUP&lt;/code&gt;, and &lt;code&gt;CUBE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Exact aggregates&lt;/strong&gt; — &lt;code&gt;MEDIAN&lt;/code&gt;, &lt;code&gt;PERCENTILE_CONT&lt;/code&gt;, &lt;code&gt;ARRAY_AGG&lt;/code&gt;, and &lt;code&gt;STRING_AGG&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;examples&quot;&gt;Examples&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#examples&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;rank-rows-with-a-window-function&quot;&gt;Rank rows with a window function&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#rank-rows-with-a-window-function&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; customer_id, region,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;       ROW_NUMBER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;OVER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;PARTITION&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; total_amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; rank_in_region&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;filter-with-qualify&quot;&gt;Filter with QUALIFY&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#filter-with-qualify&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; customer_id, region, total_amount&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;QUALIFY &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;ROW_NUMBER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;OVER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;PARTITION&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; total_amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;combine-tables-with-a-set-operation&quot;&gt;Combine tables with a set operation&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#combine-tables-with-a-set-operation&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; customer_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;EXCEPT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; customer_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;archived_sales&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;The named &lt;code&gt;WINDOW&lt;/code&gt; clause is not supported — inline the &lt;code&gt;OVER (...)&lt;/code&gt; specification at each call site. For the full syntax reference, refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. For supported features and performance guidance, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/&quot;&gt;Limitations and best practices&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Cloudflare Mesh, Cloudflare Tunnel, Cloudflare WAN, Cloudflare One - Manage all your routes from one page in the dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-06-19-unified-routes-page/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-19-unified-routes-page/</guid><description>
&lt;p&gt;The &lt;strong&gt;Routes&lt;/strong&gt; page in the Cloudflare dashboard now shows the routes across all of your connectors — &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;Cloudflare Mesh&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; routes alongside &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/&quot;&gt;Cloudflare WAN&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/magic-transit/&quot;&gt;Magic Transit&lt;/a&gt; static routes — in a single table, instead of a separate routes view per product.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=948,format=webp/_astro/2026-06-19-unified-routes.B3igBY20.gif&quot; alt=&quot;The unified Routes page in the Cloudflare dashboard, showing routes across connectors in a single table&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1800&quot; height=&quot;948&quot;&gt;
&lt;p&gt;From the unified Routes page you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Visualize your network with an interactive map&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;See every route in one table&lt;/strong&gt;, with its destination, type, connector, priority, and source, and filter or sort to find what you need.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create, edit, and delete routes&lt;/strong&gt; 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 &lt;strong&gt;connector name&lt;/strong&gt; instead of typing its IP.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manage &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/virtual-networks/&quot;&gt;virtual networks&lt;/a&gt;&lt;/strong&gt; from a dedicated tab.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test a route&lt;/strong&gt; to see which connector and next hop a destination resolves to before you commit a change.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To find it, go to &lt;strong&gt;Networking&lt;/strong&gt; &amp;gt; &lt;strong&gt;Routes&lt;/strong&gt; in the dashboard sidebar.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/magic-networks/routes&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Routes&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;
&lt;p&gt;Your existing routes, APIs, and configurations are unchanged — this is a dashboard experience that brings them together in one place. Learn how to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/routes/add-routes/&quot;&gt;add routes&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/virtual-networks/&quot;&gt;manage virtual networks&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><product>Cloudflare Mesh</product><category>Cloudflare Mesh</category><category>Cloudflare Tunnel</category><category>Cloudflare WAN</category><category>Cloudflare One</category></item><item><title>Durable Objects, Workers - New Asia-Pacific location hints: apac-ne and apac-se</title><link>https://developers.cloudflare.com/changelog/post/2026-06-19-apac-ne-apac-se-location-hints/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-19-apac-ne-apac-se-location-hints/</guid><description>&lt;p&gt;Durable Objects now supports two new location hints for Asia-Pacific: &lt;code&gt;apac-ne&lt;/code&gt; (Northeast Asia-Pacific) and &lt;code&gt;apac-se&lt;/code&gt; (Southeast Asia-Pacific). Use &lt;code&gt;apac-ne&lt;/code&gt; or &lt;code&gt;apac-se&lt;/code&gt; when you want finer-grained placement within Asia-Pacific rather than the broader &lt;code&gt;apac&lt;/code&gt; hint.&lt;/p&gt;
&lt;p&gt;Use the new hints the same way as any other &lt;code&gt;locationHint&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Northeast Asia-Pacific (Japan, Korea, etc.)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stubNE&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_DURABLE_OBJECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(id, { locationHint: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;apac-ne&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Southeast Asia-Pacific (Singapore, Indonesia, etc.)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stubSE&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_DURABLE_OBJECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(id, { locationHint: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;apac-se&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;If your users are spread across all of Asia-Pacific, the existing &lt;code&gt;apac&lt;/code&gt; hint remains the right choice. Only reach for &lt;code&gt;apac-ne&lt;/code&gt; or &lt;code&gt;apac-se&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For the full list of supported hints, refer to &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/reference/data-location/#provide-a-location-hint&quot;&gt;Data location — Provide a location hint&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Durable Objects - Outbound connections keep Durable Objects alive</title><link>https://developers.cloudflare.com/changelog/post/2026-06-19-outbound-connections-keep-dos-alive/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-19-outbound-connections-keep-dos-alive/</guid><description>&lt;p&gt;Durable Objects now remain alive for the duration of active outbound connections created via &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/tcp-sockets/&quot;&gt;&lt;code&gt;connect()&lt;/code&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;before-streaming-connections-were-cut-off-by-eviction&quot;&gt;Before: streaming connections were cut off by eviction&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#before-streaming-connections-were-cut-off-by-eviction&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=820,height=360,format=svg/_astro/outbound-connection-before.jZgN3tY3.svg&quot; alt=&quot;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&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;820&quot; height=&quot;360&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;after-active-outbound-connections-keep-the-durable-object-alive&quot;&gt;After: active outbound connections keep the Durable Object alive&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#after-active-outbound-connections-keep-the-durable-object-alive&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=820,height=360,format=svg/_astro/outbound-connection-after.CxPT16q0.svg&quot; alt=&quot;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&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;820&quot; height=&quot;360&quot;&gt;
&lt;p&gt;If you are &lt;a href=&quot;https://developers.cloudflare.com/agents/&quot;&gt;building agents on Cloudflare&lt;/a&gt;, this is especially relevant. An agent that streams tokens from an LLM while &lt;a href=&quot;https://developers.cloudflare.com/agents/concepts/calling-llms/&quot;&gt;calling models&lt;/a&gt;, or that performs &lt;a href=&quot;https://developers.cloudflare.com/agents/concepts/agentic-patterns/long-running-agents/&quot;&gt;long-running tasks&lt;/a&gt; over an outbound connection, now stays alive for the duration of that connection instead of being evicted mid-stream.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Limits:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Each outbound connection keeps the Durable Object alive for a maximum of &lt;strong&gt;15 minutes&lt;/strong&gt;. After 15 minutes, the connection stops preventing eviction (the connection itself continues operating), and the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/concepts/durable-object-lifecycle/&quot;&gt;standard eviction rules&lt;/a&gt; resume.&lt;/li&gt;
&lt;li&gt;The Durable Object&apos;s existing &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/platform/limits/&quot;&gt;per-account instance limits&lt;/a&gt; still apply.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/concepts/durable-object-lifecycle/&quot;&gt;Lifecycle of a Durable Object&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category></item><item><title>Workers - Temporary accounts for AI agent deployments</title><link>https://developers.cloudflare.com/changelog/post/2026-06-19-temporary-accounts-for-agents/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-19-temporary-accounts-for-agents/</guid><description>&lt;p&gt;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 &lt;code&gt;--temporary&lt;/code&gt;, then deploy the Worker to a temporary preview account.&lt;/p&gt;
&lt;p&gt;To try this with your agent, update to Wrangler 4.102.0 or later, make sure you are logged out (&lt;code&gt;wrangler logout&lt;/code&gt;), and then ask your agent to build something and deploy it to Cloudflare. The agent should follow Wrangler&apos;s output and deploy using the &lt;code&gt;--temporary&lt;/code&gt; flag.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1748,height=368,format=webp/_astro/claim-deployments-flow.Co0tUHG4.png&quot; alt=&quot;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&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1748&quot; height=&quot;368&quot;&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --temporary&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/claim-deployments/&quot;&gt;Claim deployments (temporary accounts)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more context, refer to &lt;a href=&quot;https://blog.cloudflare.com/temporary-accounts/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Temporary Cloudflare Accounts for Agents&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 19 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare One, Access - Cloudflare identity provider is now the default for new accounts</title><link>https://developers.cloudflare.com/changelog/post/2026-06-18-cloudflare-idp-default/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-18-cloudflare-idp-default/</guid><description>&lt;p&gt;When you create a new Zero Trust organization, Cloudflare now adds the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/cloudflare/&quot;&gt;Cloudflare identity provider&lt;/a&gt; as your default login method. Previously, new organizations started with &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/one-time-pin/&quot;&gt;one-time PIN (OTP)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/&quot;&gt;third-party identity provider&lt;/a&gt; whenever you need to.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category><category>Access</category></item><item><title>Containers - exec() is now available for Containers</title><link>https://developers.cloudflare.com/changelog/post/2026-06-18-container-exec/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-18-container-exec/</guid><description>
&lt;p&gt;&lt;code&gt;exec()&lt;/code&gt; is now available for &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt;. Use &lt;code&gt;this.ctx.container.exec()&lt;/code&gt; to start processes inside a running Container, stream standard input and output, inspect exit codes, and signal each process.&lt;/p&gt;
&lt;p&gt;Call &lt;code&gt;exec()&lt;/code&gt; from a class extending &lt;code&gt;Container&lt;/code&gt;, or from another Durable Object through &lt;code&gt;this.ctx.container&lt;/code&gt;. The associated Container must already be running.&lt;/p&gt;
&lt;p&gt;This example starts the Container when needed, then reads its Node.js version:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Container } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/containers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyContainer&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Container&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; readVersion&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.container.running) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; process&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.container.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;node&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;--version&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; output&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; process.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; decoder&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; TextDecoder&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			exitCode: output.exitCode,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			stdout: decoder.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;decode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(output.stdout),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			stderr: decoder.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;decode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(output.stderr),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Container } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/containers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyContainer&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Container&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; readVersion&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.container.running) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; process&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.container.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;node&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;--version&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; output&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; process.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; decoder&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; TextDecoder&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			exitCode: output.exitCode,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			stdout: decoder.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;decode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(output.stdout),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			stderr: decoder.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;decode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(output.stderr),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;The command array starts an executable directly, without an implicit shell. Invoke a shell explicitly for pipes, redirects, or variable expansion.&lt;/p&gt;
&lt;p&gt;One RPC method can coordinate multiple &lt;code&gt;exec()&lt;/code&gt; calls in one caller-to-Durable Object round trip. It can also pass byte-oriented &lt;code&gt;ReadableStream&lt;/code&gt; input or return streamed output with flow control.&lt;/p&gt;
&lt;p&gt;For options and streaming examples, refer to &lt;a href=&quot;https://developers.cloudflare.com/containers/execute-commands/&quot;&gt;Execute commands&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Hyperdrive, Workers - Create PlanetScale Postgres and MySQL databases, billed to your Cloudflare account</title><link>https://developers.cloudflare.com/changelog/post/2026-06-18-planetscale-databases-cloudflare-billing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-18-planetscale-databases-cloudflare-billing/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Create a PlanetScale database from the Cloudflare dashboard to check out globally distributed Workers optimized for regional data access.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/hyperdrive?modal=1&amp;amp;type=planetscale&amp;amp;step=1&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Create a PlanetScale database&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1280,height=240,format=svg/_astro/planetscale-request-flow.CYsRfKtG.svg&quot; alt=&quot;Request flow from a user to Workers, Hyperdrive caches, connection pools, and PlanetScale.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;240&quot;&gt;
&lt;p&gt;PlanetScale databases created from Cloudflare work with &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Workers&lt;/a&gt; through &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/&quot;&gt;Hyperdrive&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;PlanetScale usage appears on your Cloudflare invoice each billing period as a dollar total at PlanetScale&apos;s standard &lt;a href=&quot;https://planetscale.com/pricing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;pricing&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. You can introspect per-database billing usage via PlanetScale&apos;s &lt;a href=&quot;https://planetscale.com/docs/billing#organization-usage-and-billing-page&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To get started, refer to &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/planetscale/&quot;&gt;PlanetScale Postgres and MySQL with Hyperdrive&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category><category>Workers</category></item><item><title>Radar - Updated Workers AI popularity metric in Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-06-18-radar-workers-ai-inference-metric/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-18-radar-workers-ai-inference-metric/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; has changed how it measures &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt; model and task popularity.&lt;/p&gt;
&lt;p&gt;Previously, popularity was based on the number of unique accounts running inferences against each model or task. It is now based on the &lt;strong&gt;number of inferences&lt;/strong&gt;, 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.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://radar.cloudflare.com/ai-insights#workers-ai-model-popularity&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Workers AI model popularity&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; chart shows the distribution of inferences across models.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=938,format=webp/_astro/workers-ai-model-popularity.CMw_WVXg.png&quot; alt=&quot;Screenshot of the Workers AI model popularity chart on the AI Insights page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;938&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://radar.cloudflare.com/ai-insights#workers-ai-task-popularity&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Workers AI task popularity&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; chart shows the distribution of inferences across tasks.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=938,format=webp/_astro/workers-ai-task-popularity.ZoA-NO8k.png&quot; alt=&quot;Screenshot of the Workers AI task popularity chart on the AI Insights page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;938&quot;&gt;
&lt;p&gt;The same data is available via the following API endpoints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/ai/subresources/inference/methods/summary_v2/&quot;&gt;&lt;code&gt;/ai/inference/summary/{dimension}&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/ai/subresources/inference/methods/timeseries_groups_v2/&quot;&gt;&lt;code&gt;/ai/inference/timeseries_groups/{dimension}&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Explore the data on the &lt;a href=&quot;https://radar.cloudflare.com/ai-insights&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI Insights page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Speed - Cloudflare Fonts error handling and security improvements</title><link>https://developers.cloudflare.com/changelog/post/2026-06-18-cloudflare-fonts-error-handling-security/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-18-cloudflare-fonts-error-handling-security/</guid><description>&lt;p&gt;Cloudflare Fonts now forwards &lt;code&gt;/cf-fonts&lt;/code&gt; 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.&lt;/p&gt;</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate><product>Speed</product><category>Speed</category></item><item><title>Artifacts - Manage Artifacts from the Cloudflare dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-06-17-dashboard-management/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-17-dashboard-management/</guid><description>&lt;p&gt;You can now configure &lt;a href=&quot;https://developers.cloudflare.com/artifacts/concepts/how-artifacts-works/&quot;&gt;Artifacts&lt;/a&gt; namespaces, repos, and tokens directly from the Cloudflare dashboard.&lt;/p&gt;
&lt;p&gt;Artifacts is Git-compatible storage that lets you store repos on Cloudflare and interact with them using standard Git workflows.&lt;/p&gt;
&lt;p&gt;You can view and create &lt;a href=&quot;https://developers.cloudflare.com/artifacts/concepts/namespaces/#use-namespaces-as-containers&quot;&gt;namespaces&lt;/a&gt;, which are top-level containers for repos:&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1804,height=598,format=webp/_astro/dashboard-namespaces.0BJelWZh.png&quot; alt=&quot;Artifacts namespaces dashboard showing namespace search and create namespace controls&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1804&quot; height=&quot;598&quot;&gt;
&lt;p&gt;You can view, create, fork, and search repos within a namespace:&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1874,height=592,format=webp/_astro/dashboard-repositories.M9P9JUL_.png&quot; alt=&quot;Artifacts repositories dashboard showing repo source, access, and created columns&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1874&quot; height=&quot;592&quot;&gt;
&lt;p&gt;You can open a repo to view its files and copy its Git remote URL.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2194,height=806,format=webp/_astro/dashboard-repo-overview.CSHxrCW2.png&quot; alt=&quot;Artifacts repository overview showing files, commits, token management, and quick actions&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2194&quot; height=&quot;806&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To get started, go to the &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and select &lt;strong&gt;Storage &amp;amp; databases&lt;/strong&gt; &amp;gt; &lt;strong&gt;Artifacts&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://forms.gle/DwBoPRa3CWQ8ajFp7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;request form&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 17 Jun 2026 12:00:00 GMT</pubDate><product>Artifacts</product><category>Artifacts</category></item><item><title>SSL/TLS - Post-quantum ML-DSA certificates for Authenticated Origin Pulls and Custom Origin Trust Store</title><link>https://developers.cloudflare.com/changelog/post/2026-06-17-pqc-mldsa-aop-cots/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-17-pqc-mldsa-aop-cots/</guid><description>&lt;p&gt;Cloudflare now accepts &lt;a href=&quot;https://csrc.nist.gov/pubs/fips/204/final&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ML-DSA&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; (FIPS 204) post-quantum certificates on the connection between Cloudflare&apos;s edge and your origin server. Combined with our existing &lt;a href=&quot;https://developers.cloudflare.com/ssl/post-quantum-cryptography/#hybrid-key-agreement&quot;&gt;X25519MLKEM768&lt;/a&gt; key agreement, this lets you establish end-to-end post-quantum authentication on the Cloudflare-to-origin connection.&lt;/p&gt;
&lt;p&gt;ML-DSA is supported in two origin-facing features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/ssl/origin-configuration/authenticated-origin-pull/&quot;&gt;Authenticated Origin Pulls&lt;/a&gt; (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.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/ssl/origin-configuration/custom-origin-trust-store/&quot;&gt;Custom Origin Trust Store&lt;/a&gt; (COTS) — upload an ML-DSA certificate authority that Cloudflare will trust when validating your origin server certificate under &lt;a href=&quot;https://developers.cloudflare.com/ssl/origin-configuration/ssl-modes/full-strict/&quot;&gt;Full (strict) encryption mode&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/ssl/post-quantum-cryptography/pqc-to-origin/#post-quantum-signatures&quot;&gt;Post-quantum signatures&lt;/a&gt; for certificate generation and setup guidance, and to &lt;a href=&quot;https://developers.cloudflare.com/ssl/post-quantum-cryptography/pqc-cloudflare-products/&quot;&gt;PQC in Cloudflare products&lt;/a&gt; for the current post-quantum deployment status across Cloudflare.&lt;/p&gt;</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate><product>SSL/TLS</product><category>SSL/TLS</category></item><item><title>Agents, Workers - Agents SDK improves browser automation, code execution, and recovery</title><link>https://developers.cloudflare.com/changelog/post/2026-06-16-agents-sdk-v0.16.1/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-16-agents-sdk-v0.16.1/</guid><description>
&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; makes it easier to build agents that can safely interact with real systems and keep working through interruptions.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;safer-browser-automation&quot;&gt;Safer browser automation&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#safer-browser-automation&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Agents can now use &lt;a href=&quot;https://developers.cloudflare.com/browser-run/&quot;&gt;Browser Run&lt;/a&gt; through a single durable &lt;code&gt;browser_execute&lt;/code&gt; 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.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; browserTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createBrowserTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	ctx: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	browser: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;BROWSER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	loader: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	session: { mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;dynamic&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; browserTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createBrowserTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	ctx: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	browser: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;BROWSER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	loader: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	session: { mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;dynamic&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The browser tools also add Live View URLs, optional session recording, and quick actions such as &lt;code&gt;browser_markdown&lt;/code&gt;, &lt;code&gt;browser_extract&lt;/code&gt;, &lt;code&gt;browser_links&lt;/code&gt;, and &lt;code&gt;browser_scrape&lt;/code&gt; for one-shot browsing tasks.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;resumable-code-execution-with-approvals&quot;&gt;Resumable code execution with approvals&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#resumable-code-execution-with-approvals&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Code Mode now uses &lt;code&gt;createCodemodeRuntime&lt;/code&gt;, connectors, and a durable execution log. This lets you give a model one &lt;code&gt;codemode&lt;/code&gt; 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.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; runtime&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createCodemodeRuntime&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	ctx: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	executor: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DynamicWorkerExecutor&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ loader: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	connectors: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; GithubConnector&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env, connection)],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamText&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	messages,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	tools: { codemode: runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;tool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; runtime&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createCodemodeRuntime&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	ctx: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	executor: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DynamicWorkerExecutor&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ loader: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	connectors: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; GithubConnector&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env, connection)],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamText&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	messages,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	tools: { codemode: runtime.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;tool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;better-think-delegation&quot;&gt;Better Think delegation&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#better-think-delegation&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Think sub-agents can now use client-defined tools over the RPC &lt;code&gt;chat()&lt;/code&gt; path. A parent agent can pass tool schemas with &lt;code&gt;clientTools&lt;/code&gt; and resolve tool calls through &lt;code&gt;onClientToolCall&lt;/code&gt;. This lets delegated agents use caller-provided capabilities without requiring a browser WebSocket.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; child.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;chat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(message, callback, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	signal,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	clientTools: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;get_user_timezone&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			description: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Get the caller&apos;s timezone&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			parameters: { type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onClientToolCall&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;toolName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; runClientTool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(toolName, input);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; child.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;chat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(message, callback, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	signal,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	clientTools: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;get_user_timezone&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			description: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Get the caller&apos;s timezone&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			parameters: { type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onClientToolCall&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;toolName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; runClientTool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(toolName, input);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Think Workflows also improve &lt;code&gt;step.prompt()&lt;/code&gt;. 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.&lt;/p&gt;
&lt;p&gt;The unified Think execute tool can also include &lt;code&gt;cdp.*&lt;/code&gt; browser capabilities alongside &lt;code&gt;state.*&lt;/code&gt; and &lt;code&gt;tools.*&lt;/code&gt; when Browser Run is bound.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;voice-output-device-selection&quot;&gt;Voice output device selection&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#voice-output-device-selection&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Voice clients can route assistant audio to a specific output device. Use &lt;code&gt;outputDeviceId&lt;/code&gt; with &lt;code&gt;useVoiceAgent&lt;/code&gt;, or call &lt;code&gt;client.setOutputDevice()&lt;/code&gt; from the framework-agnostic client.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; voice&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useVoiceAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MyVoiceAgent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	outputDeviceId: selectedSpeakerId,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;tsx&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;tsx&quot; data-nb-lang=&quot;tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; voice&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useVoiceAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MyVoiceAgent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	outputDeviceId: selectedSpeakerId,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Browsers without speaker-selection support continue playing through the default output device and report a non-fatal &lt;code&gt;outputDeviceError&lt;/code&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;reliability-fixes&quot;&gt;Reliability fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#reliability-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;This release includes several fixes for production agents:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;useAgent&lt;/code&gt; and &lt;code&gt;AgentClient&lt;/code&gt; handle WebSocket replacement more reliably during reconnects and configuration changes.&lt;/li&gt;
&lt;li&gt;Chat stream replay is more reliable after reconnects, deploys, and provider errors.&lt;/li&gt;
&lt;li&gt;Fiber recovery continues across multi-pass scans and backs off when recovery hooks keep failing.&lt;/li&gt;
&lt;li&gt;Agent teardown continues even when the request that started teardown is canceled.&lt;/li&gt;
&lt;li&gt;Large session histories use byte-budgeted reads to reduce memory pressure during startup.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-01efea8e-b305-46ed-aa61-155f886f7fea-npm&quot; id=&quot;pm-tab-pm-01efea8e-b305-46ed-aa61-155f886f7fea-npm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-01efea8e-b305-46ed-aa61-155f886f7fea-yarn&quot; id=&quot;pm-tab-pm-01efea8e-b305-46ed-aa61-155f886f7fea-yarn&quot; data-nb-pm-tab class=&quot;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&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-01efea8e-b305-46ed-aa61-155f886f7fea-pnpm&quot; id=&quot;pm-tab-pm-01efea8e-b305-46ed-aa61-155f886f7fea-pnpm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-01efea8e-b305-46ed-aa61-155f886f7fea-bun&quot; id=&quot;pm-tab-pm-01efea8e-b305-46ed-aa61-155f886f7fea-bun&quot; data-nb-pm-tab class=&quot;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&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-01efea8e-b305-46ed-aa61-155f886f7fea-npm&quot; aria-labelledby=&quot;pm-tab-pm-01efea8e-b305-46ed-aa61-155f886f7fea-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-01efea8e-b305-46ed-aa61-155f886f7fea-yarn&quot; aria-labelledby=&quot;pm-tab-pm-01efea8e-b305-46ed-aa61-155f886f7fea-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-01efea8e-b305-46ed-aa61-155f886f7fea-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-01efea8e-b305-46ed-aa61-155f886f7fea-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-01efea8e-b305-46ed-aa61-155f886f7fea-bun&quot; aria-labelledby=&quot;pm-tab-pm-01efea8e-b305-46ed-aa61-155f886f7fea-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add agents@latest @cloudflare/think@latest @cloudflare/codemode@latest @cloudflare/ai-chat@latest @cloudflare/voice@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/agents/tools/codemode/&quot;&gt;Code Mode documentation&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/agents/tools/browser/&quot;&gt;Browser tools documentation&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/agents/harnesses/think/tools/&quot;&gt;Think tools documentation&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/agents/communication-channels/voice/&quot;&gt;Voice documentation&lt;/a&gt; for more information.&lt;/p&gt;</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>AI Crawl Control - Pay Per Crawl advanced configuration</title><link>https://developers.cloudflare.com/changelog/post/2026-06-16-pay-per-crawl-advanced-configuration/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-16-pay-per-crawl-advanced-configuration/</guid><description>&lt;p&gt;You can now configure advanced Pay Per Crawl settings for your zone, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Disable Pay Per Crawl by URI pattern&lt;/strong&gt; using &lt;a href=&quot;https://developers.cloudflare.com/rules/configuration-rules/&quot;&gt;Configuration Rules&lt;/a&gt; to offer free access to specific pages while charging for others.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic pricing&lt;/strong&gt; by having your origin return a &lt;code&gt;crawler-price&lt;/code&gt; response header, or by using a &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Cloudflare Worker&lt;/a&gt; to set prices based on request properties.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When dynamic pricing is enabled, Pay Per Crawl adds a &lt;code&gt;cf-pay-per-crawl&lt;/code&gt; request header to origin requests so your origin or Worker can determine the appropriate price.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-site-owner/advanced-configuration/&quot;&gt;Advanced configuration documentation&lt;/a&gt; for details.&lt;/p&gt;</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><product>AI Crawl Control</product><category>AI Crawl Control</category></item><item><title>Cloudflare Images - New optimization features in Images</title><link>https://developers.cloudflare.com/changelog/post/2026-06-16-new-optimization-features/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-16-new-optimization-features/</guid><description>&lt;p&gt;These updates introduce new features for optimizing and manipulating with Images:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New &lt;code&gt;composite&lt;/code&gt; option:&lt;/strong&gt; Control how &lt;a href=&quot;https://developers.cloudflare.com/images/optimization/draw-overlays/#composite&quot;&gt;overlays are blended&lt;/a&gt; with the base image.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Percentage widths:&lt;/strong&gt; Set the dimensions of an overlay as &lt;a href=&quot;https://developers.cloudflare.com/images/optimization/draw-overlays/#width-and-height&quot;&gt;a fraction of the dimensions&lt;/a&gt; of the base image.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New &lt;code&gt;fit&lt;/code&gt; modes:&lt;/strong&gt; Use &lt;a href=&quot;https://developers.cloudflare.com/images/optimization/features/#aspect-crop&quot;&gt;&lt;code&gt;aspect-crop&lt;/code&gt;&lt;/a&gt; to always preserve the target aspect ratio or &lt;a href=&quot;https://developers.cloudflare.com/images/optimization/features/#scale-up&quot;&gt;&lt;code&gt;scale-up&lt;/code&gt;&lt;/a&gt; to always enlarge images.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New &lt;code&gt;upscale&lt;/code&gt; parameter:&lt;/strong&gt; Apply &lt;a href=&quot;https://developers.cloudflare.com/images/optimization/features/#upscale&quot;&gt;AI upscaling&lt;/a&gt; to produce sharper, more detailed results when enlarging images.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><product>Cloudflare Images</product><category>Cloudflare Images</category></item><item><title>Workers, Agents, Workers AI - Introducing GLM-5.2 on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2026-06-16-glm-5.2-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-16-glm-5.2-workers-ai/</guid><description>&lt;p&gt;We are excited to announce &lt;strong&gt;GLM-5.2&lt;/strong&gt; on Workers AI, Z.ai&apos;s flagship agentic coding model.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/glm-5.2/&quot;&gt;&lt;code&gt;@cf/zai-org/glm-5.2&lt;/code&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key features and use cases:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agentic coding&lt;/strong&gt;: Designed for autonomous coding tasks, long-horizon planning, and complex software engineering workflows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Large context window&lt;/strong&gt;: 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&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function calling&lt;/strong&gt;: Build agents that invoke tools and APIs across multiple conversation turns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reasoning&lt;/strong&gt;: Tackles complex problem-solving and step-by-step reasoning tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use GLM-5.2 through the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/bindings/&quot;&gt;Workers AI binding&lt;/a&gt; (&lt;code&gt;env.AI.run()&lt;/code&gt;), the REST API at &lt;code&gt;/run&lt;/code&gt; or &lt;code&gt;/v1/chat/completions&lt;/code&gt;, or &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pricing is available on the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/glm-5.2/&quot;&gt;model page&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing page&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Agents</category><category>Workers AI</category></item><item><title>Workers VPC - TCP connections via connect() over VPC Networks</title><link>https://developers.cloudflare.com/changelog/post/2026-06-16-tcp-connect-vpc-networks/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-16-tcp-connect-vpc-networks/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/&quot;&gt;VPC Network&lt;/a&gt; bindings now support the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/tcp-sockets/&quot;&gt;&lt;code&gt;connect()&lt;/code&gt;&lt;/a&gt; Socket API for raw TCP connections to private destinations, in addition to HTTP traffic via &lt;code&gt;fetch()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;vpc_networks&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PRIVATE_NETWORK&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;network_id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf1:network&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;remote&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;vpc_networks&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PRIVATE_NETWORK&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;network_id = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf1:network&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;remote = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;At runtime, use &lt;code&gt;connect()&lt;/code&gt; on the binding to open a TCP socket to a private destination:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Open a TCP connection to a private Redis instance&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; socket&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;PRIVATE_NETWORK&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;connect&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;10.0.1.50:6379&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Write a Redis PING command&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; writer&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; socket.writable.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getWriter&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; writer.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; TextEncoder&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PING&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\r\n&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; writer.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(socket.readable);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;&lt;code&gt;connect()&lt;/code&gt; over VPC Networks currently supports plaintext TCP only.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;For more details, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/&quot;&gt;VPC Networks&lt;/a&gt; and the &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/api/&quot;&gt;Workers Binding API&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><product>Workers VPC</product><category>Workers VPC</category></item><item><title>Workers - Workers tracing now supports custom spans</title><link>https://developers.cloudflare.com/changelog/post/2026-06-16-custom-spans/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-16-custom-spans/</guid><description>&lt;p&gt;You can now create custom trace spans in your Workers code using &lt;code&gt;tracing.enterSpan()&lt;/code&gt;. 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.&lt;/p&gt;
&lt;p&gt;The API is available via &lt;code&gt;import { tracing } from &quot;cloudflare:workers&quot;&lt;/code&gt; or through the handler context as &lt;code&gt;ctx.tracing&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { tracing } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; tracing.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;enterSpan&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;handleRequest&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      span.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;url.path&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; URL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request.url).pathname);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;      const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_KV&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;      return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(data);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Spans nest automatically based on the JavaScript async context, and are auto-ended when the callback returns or its returned promise settles. The &lt;code&gt;Span&lt;/code&gt; object provides &lt;code&gt;setAttribute(key, value)&lt;/code&gt; for attaching metadata and an &lt;code&gt;isTraced&lt;/code&gt; property to check whether the current request is being sampled.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1988,height=670,format=webp/_astro/wobs_custom_spans_screenshot.B-hsHjyv.png&quot; alt=&quot;Trace waterfall showing custom spans nested alongside automatic KV and fetch instrumentation&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1988&quot; height=&quot;670&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/observability/traces/#how-to-enable-tracing&quot;&gt;Tracing must be enabled&lt;/a&gt; in your Wrangler configuration for spans to be recorded.&lt;/p&gt;
&lt;p&gt;For full API details and examples, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/traces/custom-spans/&quot;&gt;Custom spans&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>WAF - Use Cloudforce One threat intelligence in WAF rules</title><link>https://developers.cloudflare.com/changelog/post/2026-06-15-threat-intelligence-fields/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-15-threat-intelligence-fields/</guid><description>&lt;p&gt;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 &lt;code&gt;cf.intel.ip.*&lt;/code&gt; fields that you can use in &lt;a href=&quot;https://developers.cloudflare.com/waf/custom-rules/&quot;&gt;custom rules&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/waf/rate-limiting-rules/&quot;&gt;rate limiting rules&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The detection populates the following fields. Use the &lt;a href=&quot;https://developers.cloudflare.com/ruleset-engine/rules-language/functions/#any&quot;&gt;&lt;code&gt;any()&lt;/code&gt;&lt;/a&gt; function with the &lt;code&gt;[*]&lt;/code&gt; wildcard to match array values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cf.intel.ip.datasets&lt;/code&gt; — the dataset that flagged the IP address (&lt;code&gt;ddos&lt;/code&gt; or &lt;code&gt;waf&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cf.intel.ip.target_industries&lt;/code&gt; — industries the IP address has targeted.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cf.intel.ip.attacker_names&lt;/code&gt; — known threat actors associated with the IP address.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cf.intel.ip.attacker_countries&lt;/code&gt; — source countries of the threat activity.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cf.intel.ip.target_countries&lt;/code&gt; — countries the IP address has targeted.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, the following custom rule expression blocks requests from IP addresses associated with DDoS activity that have targeted France:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;any(cf.intel.ip.target_countries[*] == &quot;FR&quot;) and any(cf.intel.ip.datasets[*] == &quot;ddos&quot;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;These fields work with the Cloudflare API and Terraform. Matches are logged in &lt;a href=&quot;https://developers.cloudflare.com/waf/analytics/security-analytics/&quot;&gt;Security Analytics&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The threat intelligence detection is available to customers with an active &lt;a href=&quot;https://developers.cloudflare.com/security-center/cloudforce-one/&quot;&gt;Cloudforce One&lt;/a&gt; subscription. For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/waf/detections/threat-intelligence/&quot;&gt;Threat intelligence&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>WAF - WAF Release - 2026-06-15</title><link>https://developers.cloudflare.com/changelog/post/2026-06-15-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-15-waf-release/</guid><description>
&lt;p&gt;This week&apos;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;439c4ef64b32447989bdf412b4c29bc6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...b4c29bc6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Ghost CMS - SQLi - CVE:CVE-2026-26980&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;6c64b68ef5ed45e7a622cdaab56f403f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...b56f403f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Obfuscated Boolean - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>AI Gateway - View the user agent of requests in AI Gateway logs</title><link>https://developers.cloudflare.com/changelog/post/2026-06-12-user-agent-logging/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-12-user-agent-logging/</guid><description>&lt;p&gt;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 &lt;code&gt;openai-python&lt;/code&gt; versus a custom application or a Cloudflare Worker.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/observability/logging/&quot;&gt;Logging&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Durable Objects, Workers - Filter Durable Objects metrics by object ID or name</title><link>https://developers.cloudflare.com/changelog/post/2026-06-12-durable-objects-metrics-filter-by-id-name/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-12-durable-objects-metrics-filter-by-id-name/</guid><description>
&lt;p&gt;You can now filter the &lt;strong&gt;Metrics&lt;/strong&gt; tab for a Durable Objects namespace by an individual Durable Object&apos;s &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/id/&quot;&gt;ID&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/id/#name&quot;&gt;name&lt;/a&gt; in the Cloudflare dashboard. Previously, metrics charts only showed aggregate, namespace-level data, making it difficult to isolate the behavior of a specific object.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/durable-objects&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Durable Objects&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2936,height=1482,format=webp/_astro/durable-objects-metrics-dashboard.BFZTyhWU.png&quot; alt=&quot;The Durable Objects Metrics tab filtered to a single object by ID, showing per-object requests and errors by invocation status.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2936&quot; height=&quot;1482&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Metrics are powered by the &lt;a href=&quot;https://developers.cloudflare.com/analytics/graphql-api/&quot;&gt;GraphQL Analytics API&lt;/a&gt;, so standard analytics behavior such as ingestion delay and &lt;a href=&quot;https://developers.cloudflare.com/analytics/faq/graphql-api-inconsistent-results/&quot;&gt;sampling&lt;/a&gt; applies.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/observability/metrics-and-analytics/&quot;&gt;Metrics and analytics&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Terraform - Terraform v5.20.0 now available</title><link>https://developers.cloudflare.com/changelog/post/2026-06-12-terraform-v5.20.0-provider/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-12-terraform-v5.20.0-provider/</guid><description>&lt;p&gt;Cloudflare&apos;s Terraform v5 Provider makes it easy for developers to manage their Cloudflare infrastructure using a configuration as code approach. It releases every &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/5774&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2-3 weeks&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-resources&quot;&gt;New resources&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_ai_search_namespace:&lt;/strong&gt; Manage AI Search namespaces&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_custom_csr:&lt;/strong&gt; Manage custom certificate signing requests&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_dls_prefix_binding:&lt;/strong&gt; Manage DLS regional service prefix bindings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_flagship_app:&lt;/strong&gt; Manage Flagship feature flag apps&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_flagship_flag:&lt;/strong&gt; Manage Flagship feature flags&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_google_tag_gateway:&lt;/strong&gt; Manage Google Tag Gateway&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_load_balancer_monitor_group:&lt;/strong&gt; Manage load balancer monitor groups&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_oauth_client:&lt;/strong&gt; Manage IAM OAuth clients&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_origin_cloud_region:&lt;/strong&gt; Manage origin cloud regions (v2 endpoints)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_secrets_store:&lt;/strong&gt; Manage Secrets Store instances&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_secrets_store_secret:&lt;/strong&gt; Manage Secrets Store secrets&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_share:&lt;/strong&gt; Manage resource shares&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_share_recipient:&lt;/strong&gt; Manage share recipients&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_share_resource:&lt;/strong&gt; Manage shared resources&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_zero_trust_device_deployment_groups:&lt;/strong&gt; Manage Zero Trust device deployment groups&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_zero_trust_dlp_data_class:&lt;/strong&gt; Manage DLP data classes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_zero_trust_dlp_data_tag:&lt;/strong&gt; Manage DLP data tags&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_zero_trust_dlp_data_tag_category:&lt;/strong&gt; Manage DLP data tag categories&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_zero_trust_dlp_sensitivity_group:&lt;/strong&gt; Manage DLP sensitivity groups&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_zero_trust_dlp_sensitivity_level:&lt;/strong&gt; Manage DLP sensitivity levels&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_zero_trust_dlp_sensitivity_level_order:&lt;/strong&gt; Manage DLP sensitivity level ordering&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_zero_trust_resource_library_application:&lt;/strong&gt; Manage Zero Trust resource library applications&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_zero_trust_resource_library_category:&lt;/strong&gt; Manage Zero Trust resource library categories&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_zero_trust_tunnel_warp_connector_config:&lt;/strong&gt; Manage WARP connector tunnel configurations&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;features&quot;&gt;Features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;cache:&lt;/strong&gt; add create (POST) method for smart_tiered_cache&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cache:&lt;/strong&gt; update OPCR config to v2 endpoints&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dlp:&lt;/strong&gt; promote classification Stainless config to main&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dlp:&lt;/strong&gt; add custom prompt topics endpoint&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;email_security_block_sender:&lt;/strong&gt; state upgrader for v4 to v5 migration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;email_security_impersonation_registry:&lt;/strong&gt; state upgrader for v4 to v5 migration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;email_security_trusted_domains:&lt;/strong&gt; state upgrader for v4 to v5 migration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;snippets:&lt;/strong&gt; add Terraform &lt;code&gt;id_property&lt;/code&gt; annotations for snippet and snippet_rules&lt;/li&gt;
&lt;li&gt;bump Go SDK to cloudflare-go v7&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;bug-fixes&quot;&gt;Bug fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bug-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;account_member:&lt;/strong&gt; missing upgrade path from v5.0–v5.15&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;authenticated_origin_pulls_settings:&lt;/strong&gt; nil pointer panic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;bot_management:&lt;/strong&gt; restore &lt;code&gt;content_bots_protection&lt;/code&gt; handling in model.go&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dns_record:&lt;/strong&gt; prevent FQDN normalization from swallowing name shortening changes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;list:&lt;/strong&gt; nullify empty nested objects to prevent inconsistent result after apply&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;load_balancer_pool:&lt;/strong&gt; accept early-v5 object-shape state at schema_version=0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;load_balancer_pool:&lt;/strong&gt; add &lt;code&gt;UseStateForUnknown&lt;/code&gt; for &lt;code&gt;load_shedding&lt;/code&gt; attribute to prevent drift&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;r2_custom_domain:&lt;/strong&gt; restore degraded-response handling in resource.go&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;regional_hostname:&lt;/strong&gt; update cloudflare-go imports from v6 to v7&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;secrets_store:&lt;/strong&gt; fix model/schema parity and guard acceptance tests&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;spectrum_application:&lt;/strong&gt; accept early-v5 object-shape state at schema_version=0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;worker:&lt;/strong&gt; preserve &lt;code&gt;observability.traces.propagation_policy&lt;/code&gt; across reads&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;worker:&lt;/strong&gt; add &lt;code&gt;propagation_policy&lt;/code&gt; to observability defaults&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;worker_version:&lt;/strong&gt; restore handwritten D1 &lt;code&gt;database_id&lt;/code&gt; handling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_custom_domain:&lt;/strong&gt; missing &lt;code&gt;CertId&lt;/code&gt; field in state migration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_script:&lt;/strong&gt; restore annotations Read workaround stripped by codegen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_access_identity_provider:&lt;/strong&gt; change &lt;code&gt;read_only&lt;/code&gt; from computed to optional&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_access_identity_provider:&lt;/strong&gt; add &lt;code&gt;UseStateForUnknown&lt;/code&gt; to SAML-only config fields&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_access_identity_provider:&lt;/strong&gt; use &lt;code&gt;UseNonNullStateForUnknown&lt;/code&gt; on scim_config fields&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_access_policy:&lt;/strong&gt; populate &lt;code&gt;account_id&lt;/code&gt; when migrating zone-scoped v4 state&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_access_policy:&lt;/strong&gt; missing &lt;code&gt;common_names&lt;/code&gt; transform in migration&lt;/li&gt;
&lt;li&gt;gracefully handle nil pointer dereference when config has &lt;code&gt;attributes_flat&lt;/code&gt; during migration&lt;/li&gt;
&lt;li&gt;set initial schema version to 500 for all new resources&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;refactors&quot;&gt;Refactors&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#refactors&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Extracted &lt;code&gt;MoveState&lt;/code&gt; nil guard into shared helper&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;for-more-information&quot;&gt;For more information&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#for-more-information&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Terraform Provider&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-migration&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Version 5 Migration Guide&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/terraform/&quot;&gt;Documentation on using Terraform with Cloudflare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;List of stabilized resources&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><product>Terraform</product><category>Terraform</category></item><item><title>Workers AI - Moonshot AI Kimi K2.7 Code now available on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2026-06-12-kimi-k2-7-code-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-12-kimi-k2-7-code-workers-ai/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.7-code/&quot;&gt;&lt;code&gt;@cf/moonshotai/kimi-k2.7-code&lt;/code&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;improved-coding-and-agent-performance&quot;&gt;Improved coding and agent performance&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#improved-coding-and-agent-performance&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;K2.7 Code delivers meaningful gains over K2.6 on coding and agentic benchmarks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;+21.8%&lt;/strong&gt; on Kimi Code Bench v2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;+11.0%&lt;/strong&gt; on Program Bench&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;+31.5%&lt;/strong&gt; on MLS Bench Lite&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;reasoning-efficiency&quot;&gt;Reasoning efficiency&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#reasoning-efficiency&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;K2.7 Code uses 30% fewer reasoning tokens compared to K2.6, reducing overthinking and lowering inference cost for reasoning-heavy workloads.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-capabilities&quot;&gt;Key capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;262.1k token context window&lt;/strong&gt; for retaining full conversation history, tool definitions, and codebases across long-running agent sessions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Long-horizon coding&lt;/strong&gt; with improved instruction following and higher end-to-end coding task success rates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vision inputs&lt;/strong&gt; for processing images alongside text&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thinking mode&lt;/strong&gt; with configurable reasoning depth via &lt;code&gt;chat_template_kwargs.thinking&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-turn tool calling&lt;/strong&gt; for building agents that invoke tools across multiple conversation turns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured outputs&lt;/strong&gt; with JSON schema support&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;differences-from-kimi-k26&quot;&gt;Differences from Kimi K2.6&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#differences-from-kimi-k26&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If you are migrating from Kimi K2.6, note the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;K2.7 Code is optimized for coding tasks with improved benchmark performance and reasoning efficiency&lt;/li&gt;
&lt;li&gt;Cached input token pricing is $0.19 per M tokens (vs $0.16 for K2.6)&lt;/li&gt;
&lt;li&gt;API usage is identical — no parameter changes required&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Use Kimi K2.7 Code through the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/bindings/&quot;&gt;Workers AI binding&lt;/a&gt; (&lt;code&gt;env.AI.run()&lt;/code&gt;), the REST API at &lt;code&gt;/ai/run&lt;/code&gt;, or the OpenAI-compatible endpoint at &lt;code&gt;/v1/chat/completions&lt;/code&gt;. You can also use &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt; with any of these endpoints.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.7-code/&quot;&gt;Kimi K2.7 Code model page&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Browser Run - New formats parameter for the Browser Run /snapshot endpoint</title><link>https://developers.cloudflare.com/changelog/post/2026-06-11-browser-run-snapshot-formats/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-11-browser-run-snapshot-formats/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/&quot;&gt;Browser Run&lt;/a&gt;&apos;s &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/snapshot/&quot;&gt;&lt;code&gt;/snapshot&lt;/code&gt; endpoint&lt;/a&gt; now supports a &lt;code&gt;formats&lt;/code&gt; parameter that lets you return multiple page formats in a single API call. Previously, &lt;code&gt;/snapshot&lt;/code&gt; returned only HTML content and a screenshot. You can now also include Markdown and the accessibility tree in the same response.&lt;/p&gt;
&lt;p&gt;These formats are particularly useful for AI agent workflows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Markdown provides a token-efficient representation of page content that LLMs can process directly, without parsing HTML markup.&lt;/li&gt;
&lt;li&gt;The accessibility tree provides a structured representation of a page&apos;s elements, including roles, labels, and hierarchy, helping LLMs understand page structure and navigate its contents.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following example returns a screenshot, Markdown, and the accessibility tree in one call:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;curl&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;https://api.cloudflare.com/client/v4/accounts/&amp;lt;accountId&amp;gt;/browser-rendering/snapshot&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer &amp;lt;apiToken&amp;gt;&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;url&quot;: &quot;https://example.com/&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;formats&quot;: [&quot;screenshot&quot;, &quot;markdown&quot;, &quot;accessibilityTree&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript SDK&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Cloudflare &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; client&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Cloudflare&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	apiToken: process.env[&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;CLOUDFLARE_API_TOKEN&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; snapshot&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; client.browserRendering.snapshot.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	account_id: process.env[&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;CLOUDFLARE_ACCOUNT_ID&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	url: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://example.com/&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	formats: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;screenshot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;markdown&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;accessibilityTree&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(snapshot.markdown);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(snapshot.accessibilityTree);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;Workers Bindings&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	BROWSER&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; BrowserRun&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;BROWSER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;quickAction&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;snapshot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			url: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://example.com/&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			formats: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;screenshot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;markdown&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;accessibilityTree&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExportedHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;You must request at least two formats. If you only need one, use the respective single-format endpoint such as &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/screenshot-endpoint/&quot;&gt;&lt;code&gt;/screenshot&lt;/code&gt;&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/markdown-endpoint/&quot;&gt;&lt;code&gt;/markdown&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/snapshot/&quot;&gt;&lt;code&gt;/snapshot&lt;/code&gt; documentation&lt;/a&gt; for the full list of accepted values.&lt;/p&gt;</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>Data Loss Prevention - Define custom topics for AI prompt protection</title><link>https://developers.cloudflare.com/changelog/post/2026-06-11-custom-ai-prompt-topics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-11-custom-ai-prompt-topics/</guid><description>&lt;p&gt;You can now define custom topics for AI prompt protection. Predefined &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/detection-entries/configure-detection-entries/#ai-prompt-topics&quot;&gt;AI prompt topics&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/detection-entries/configure-detection-entries/#custom-wordlist-datasets&quot;&gt;custom wordlist or pattern entry&lt;/a&gt; instead.&lt;/p&gt;
&lt;p&gt;Custom topics run through the same &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/#granular-controls&quot;&gt;application granular controls&lt;/a&gt; path as predefined AI prompt topics. Custom topics are available for ChatGPT, Google Gemini, Perplexity, and Claude.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;create-a-custom-ai-prompt-topic&quot;&gt;Create a custom AI prompt topic&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#create-a-custom-ai-prompt-topic&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;In the &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, go to &lt;strong&gt;Zero Trust&lt;/strong&gt; &amp;gt; &lt;strong&gt;Data loss prevention&lt;/strong&gt; &amp;gt; &lt;strong&gt;Detection entries&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;AI prompt topics&lt;/strong&gt;, then select &lt;strong&gt;Custom Prompt Topic&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Add this detection entry to an existing DLP profile, or &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/#build-a-custom-profile&quot;&gt;create a new DLP profile&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Use the profile in a Gateway HTTP policy to log or block prompts that match the topic.&lt;/li&gt;
&lt;/ol&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;Write the description as a concept to classify, not a list of keywords. For example, describe &quot;internal financial forecasts and unreleased revenue figures&quot; rather than listing specific document names.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/detection-entries/configure-detection-entries/#ai-prompt-topics&quot;&gt;AI prompt topics&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><product>Data Loss Prevention</product><category>Data Loss Prevention</category></item><item><title>Workers - Track Dynamic Workers usage from the dashboard and GraphQL API</title><link>https://developers.cloudflare.com/changelog/post/2026-06-11-dynamic-workers-count/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-11-dynamic-workers-count/</guid><description>&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1476,height=1102,format=webp/_astro/dynamic-workers-count.BcGsgQ0m.png&quot; alt=&quot;Dynamic Workers usage on the Workers overview page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1476&quot; height=&quot;1102&quot;&gt;
&lt;p&gt;Customers can now view the number of &lt;a href=&quot;https://developers.cloudflare.com/dynamic-workers/&quot;&gt;Dynamic Workers&lt;/a&gt; invoked during their billing period from the Workers overview page in the Cloudflare dashboard.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;You can also query this count through the &lt;a href=&quot;https://developers.cloudflare.com/analytics/graphql-api/&quot;&gt;GraphQL Analytics API&lt;/a&gt; by using &lt;code&gt;workersInvocationsByOwnerAndScriptGroups&lt;/code&gt; and selecting &lt;code&gt;distinctDynamicWorkerCount&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;graphql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;graphql&quot; data-nb-lang=&quot;graphql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getDynamicWorkersCount&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	$accountTag&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	$filter&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AccountWorkersInvocationsByOwnerAndScriptGroupsFilter_InputObject&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	viewer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		accounts&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;accountTag&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;$accountTag&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;			workersInvocationsByOwnerAndScriptGroups&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;limit&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;10000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;$filter&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;				uniq&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;					distinctDynamicWorkerCount&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Use variables to set the account and billing-period date range:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;accountTag&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;lt;ACCOUNT_ID&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;filter&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;date_geq&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-06-01&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;date_leq&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-06-30&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/dynamic-workers/pricing/&quot;&gt;Dynamic Workers pricing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Search - Manage AI Search namespaces with Wrangler CLI</title><link>https://developers.cloudflare.com/changelog/post/2026-06-10-ai-search-namespace-wrangler-commands/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-10-ai-search-namespace-wrangler-commands/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now supports namespace-level Wrangler commands, making it easier to manage &lt;a href=&quot;https://developers.cloudflare.com/ai-search/concepts/namespaces/&quot;&gt;namespaces&lt;/a&gt; from your terminal, scripts, and agent workflows.&lt;/p&gt;
&lt;p&gt;The following commands are available:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search namespace list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List AI Search namespaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search namespace create&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a new AI Search namespace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search namespace get&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get details for a namespace&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search namespace update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update a namespace description&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search namespace delete&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete an AI Search namespace&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Create a namespace for a new application or tenant directly from the CLI:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ai-search&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; docs-production&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --description&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Production documentation search&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;List namespaces with pagination or filter by name or description:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ai-search&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; list&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --search&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; docs&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --page&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --per-page&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Use &lt;code&gt;--json&lt;/code&gt; with &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;, and &lt;code&gt;update&lt;/code&gt; to return structured output that automation and AI agents can parse directly.&lt;/p&gt;
&lt;p&gt;Instance-level commands also now support a &lt;code&gt;--namespace&lt;/code&gt; flag, so you can interact with instances inside a specific namespace from the CLI:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ai-search&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; list&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; docs-production&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For full usage details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/wrangler-commands/&quot;&gt;AI Search Wrangler commands documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>DNS - Account-level DNS records quota</title><link>https://developers.cloudflare.com/changelog/post/2026-06-10-account-level-record-quota/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-10-account-level-record-quota/</guid><description>&lt;p&gt;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&apos;s plan. Public and internal zones are counted separately, each with a default quota of 1,000,000 records.&lt;/p&gt;
&lt;p&gt;Accounts without an account-level quota are unaffected: existing per-zone quotas behave exactly as before.&lt;/p&gt;
&lt;p&gt;For more details, refer to &lt;a href=&quot;https://developers.cloudflare.com/dns/manage-dns-records/#dns-records-quota&quot;&gt;DNS records quota&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><product>DNS</product><category>DNS</category></item><item><title>Flagship - Flagship API reference now available</title><link>https://developers.cloudflare.com/changelog/post/2026-06-10-api-reference/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-10-api-reference/</guid><description>&lt;p&gt;The &lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/flagship/&quot;&gt;Flagship API reference&lt;/a&gt;&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;For example, create a new boolean flag with the API:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/flagship/apps/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/flags&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;key&quot;: &quot;new-checkout&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;enabled&quot;: true,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;default_variation&quot;: &quot;off&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;variations&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;off&quot;: false,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;on&quot;: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;rules&quot;: []&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To create an API token, go to &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/api-tokens&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Account API Tokens&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; in the Cloudflare dashboard and search for Flagship.&lt;/p&gt;
&lt;p&gt;The API reference includes endpoints for Flagship apps, flags, changelog entries, and flag evaluation. Agents can also use the &lt;a href=&quot;https://github.com/cloudflare/skills/tree/main/skills/cloudflare/references/flagship&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Flagship reference in the Cloudflare skill&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to create and manage Flagship resources.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/flagship/&quot;&gt;Flagship documentation&lt;/a&gt; to learn more about evaluating feature flags from your applications.&lt;/p&gt;</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><product>Flagship</product><category>Flagship</category></item><item><title>Cloudflare Images - Manage hosted images with the Images binding</title><link>https://developers.cloudflare.com/changelog/post/2026-06-10-hosted-images-binding/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-10-hosted-images-binding/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;env.IMAGES.hosted&lt;/code&gt; namespace supports the following storage and management operations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/images/storage/binding/#uploadimage-options&quot;&gt;&lt;code&gt;.upload(image, options)&lt;/code&gt;&lt;/a&gt; — Upload a new image to your account.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/images/storage/binding/#listoptions&quot;&gt;&lt;code&gt;.list(options)&lt;/code&gt;&lt;/a&gt; — List images with pagination.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/images/storage/binding/#imageimageiddetails&quot;&gt;&lt;code&gt;.image(imageId).details()&lt;/code&gt;&lt;/a&gt; — Get image metadata.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/images/storage/binding/#imageimageidbytes&quot;&gt;&lt;code&gt;.image(imageId).bytes()&lt;/code&gt;&lt;/a&gt; — Stream the original image bytes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/images/storage/binding/#imageimageidupdateoptions&quot;&gt;&lt;code&gt;.image(imageId).update(options)&lt;/code&gt;&lt;/a&gt; — Update metadata or access controls.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/images/storage/binding/#imageimageiddelete&quot;&gt;&lt;code&gt;.image(imageId).delete()&lt;/code&gt;&lt;/a&gt; — Delete an image.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, you can upload an image from a request body and return its metadata:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; image&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;IMAGES&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.hosted.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;upload&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request.body, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	filename: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;upload.jpg&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	metadata: { source: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(image);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Or retrieve and serve the original bytes of a hosted image:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; bytes&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;IMAGES&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.hosted.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;IMAGE_ID&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;bytes&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(bytes);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/images/storage/binding/&quot;&gt;Images binding&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><product>Cloudflare Images</product><category>Cloudflare Images</category></item><item><title>Security Center - Automated Cease and Desist templates for Brand Protection</title><link>https://developers.cloudflare.com/changelog/post/2026-06-08-brand-protection-cease-and-desist-letters/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-08-brand-protection-cease-and-desist-letters/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Brand Protection now features an &lt;strong&gt;Automated Cease &amp;amp; Desist (C&amp;amp;D)&lt;/strong&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;why-this-matters&quot;&gt;Why this matters&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#why-this-matters&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;This update introduces a major shift from pure detection to actionable enforcement, eliminating the manual burden for your Trust &amp;amp; Safety and Legal teams:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instant WHOIS and Recipient Lookup:&lt;/strong&gt; 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&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smart Template Automation:&lt;/strong&gt; We pre-fill your custom-branded templates with essential metadata, including the infringing domain, registrar name, and discovery date.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tailored Enforcement Tones:&lt;/strong&gt; Choose from three default layout strategies depending on the severity of the infrastructure match:
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Exact Match:&lt;/em&gt; A formal demand for identical trademark infringements&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Similar Match:&lt;/em&gt; A standard notice optimized for typosquatting (one-character distance matches)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Friendly Tone:&lt;/em&gt; An amicable initial outreach for potential unintentional or accidental infringements&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full Editing Control:&lt;/strong&gt; 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&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;how-it-works&quot;&gt;How it works&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#how-it-works&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When reviewing a malicious domain match inside your dashboard, your enforcement path splits depending on where the attacker is located:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;On the Cloudflare Network:&lt;/strong&gt; If the domain uses Cloudflare’s network or registrar, trigger our existing integrated abuse reporting flow with one click.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hosted Elsewhere:&lt;/strong&gt; If the domain is hosted on an external provider, click the &lt;strong&gt;Generate C&amp;amp;D Letter&lt;/strong&gt; option to launch the new document builder, pick your template, verify the auto-populated recipient data, and download your finalized PDF.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can manage your templates and enforce matches by going to the &lt;strong&gt;Cloudflare Dashboard &amp;gt; Application Security &amp;gt; Brand Protection&lt;/strong&gt; and selecting your detected Brand Protection matches.
For more information, read the &lt;a href=&quot;https://developers.cloudflare.com/security-center/brand-protection/&quot;&gt;Brand Protection documentation&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; 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.&lt;/p&gt;
&lt;/blockquote&gt;</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Sandbox SDK - Deprecating Sandbox SDK features</title><link>https://developers.cloudflare.com/changelog/post/2026-06-09-deprecating-sandbox-sdk-features/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-09-deprecating-sandbox-sdk-features/</guid><description>&lt;aside role=&quot;note&quot; aria-label=&quot;Sandbox SDK 1.0 preview&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Sandbox SDK 1.0 preview&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;A preview of &lt;strong&gt;Sandbox SDK 1.0&lt;/strong&gt; is available on &lt;code&gt;@cloudflare/sandbox@next&lt;/code&gt;. For new projects, or to move past these deprecations in one migration, refer to the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/1-0-preview/&quot;&gt;Sandbox SDK 1.0 preview&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/sandbox/1-0-preview/migrate/&quot;&gt;Migrate&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/sandbox/guides/2026-deprecation/&quot;&gt;2026 deprecation migration guide&lt;/a&gt;, or move to the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/1-0-preview/&quot;&gt;Sandbox SDK 1.0 preview&lt;/a&gt; when you can.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;http-and-websocket-transports&quot;&gt;HTTP and WebSocket transports&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#http-and-websocket-transports&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To migrate, update the &lt;code&gt;SANDBOX_TRANSPORT&lt;/code&gt; variable to &lt;code&gt;rpc&lt;/code&gt; or set the &lt;code&gt;transport&lt;/code&gt; option when calling &lt;code&gt;getSandbox()&lt;/code&gt;. For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/configuration/transport/&quot;&gt;transport configuration documentation&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;desktop&quot;&gt;Desktop&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#desktop&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;em&gt;computer-use&lt;/em&gt; shape other sandbox products expose for UI automation. Adoption stayed low, and we removed it in &lt;code&gt;0.10.2&lt;/code&gt;. If you need that capability again, you can build it on top of the sandbox with &lt;a href=&quot;https://developers.cloudflare.com/sandbox/1-0-preview/extensions/&quot;&gt;extensions&lt;/a&gt; rather than a built-in &lt;code&gt;sandbox.desktop&lt;/code&gt; API.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;expose-ports&quot;&gt;Expose ports&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#expose-ports&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;code&gt;workers.dev&lt;/code&gt; domains. To migrate from &lt;code&gt;exposePort()&lt;/code&gt; to tunnels, refer to the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/api/tunnels/&quot;&gt;tunnels API documentation&lt;/a&gt; and the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/guides/expose-services/&quot;&gt;expose services guide&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;default-sessions&quot;&gt;Default sessions&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#default-sessions&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;By default, the &lt;code&gt;exec()&lt;/code&gt; method in the Sandbox SDK maintains a default session across all calls, so a &lt;code&gt;cd&lt;/code&gt; in one call is honored in the next. This convenience helped developers writing &lt;code&gt;exec&lt;/code&gt; statements by hand, but confused agents and caused hard-to-trace bugs. As of &lt;code&gt;0.10.3&lt;/code&gt;, we have introduced the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/configuration/sandbox-options/&quot;&gt;&lt;code&gt;enableDefaultSession&lt;/code&gt;&lt;/a&gt; flag on the &lt;code&gt;getSandbox()&lt;/code&gt; interface to turn this off. Default sessions as a concept — and the flag — will be removed in an upcoming release.&lt;/p&gt;
&lt;p&gt;We recommend setting &lt;code&gt;enableDefaultSession: false&lt;/code&gt; today and using the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/api/sessions/&quot;&gt;&lt;code&gt;sandbox.createSession()&lt;/code&gt; API&lt;/a&gt; when you need the previous behavior.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;other-changes&quot;&gt;Other changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#other-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;We are also consolidating all APIs that buffer data to support streaming by default. This includes &lt;a href=&quot;https://developers.cloudflare.com/sandbox/api/files/&quot;&gt;&lt;code&gt;readFile&lt;/code&gt;, &lt;code&gt;writeFile&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/sandbox/api/commands/&quot;&gt;&lt;code&gt;exec&lt;/code&gt;&lt;/a&gt;. The stream equivalents will be removed.&lt;/p&gt;
&lt;p&gt;We are exploring moving non-core features like the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/guides/code-execution/&quot;&gt;code interpreter&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/sandbox/api/terminal/&quot;&gt;terminal&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/sandbox/guides/git-workflows/&quot;&gt;git APIs&lt;/a&gt; into helpers. These features will retain their existing APIs, so migration should be simple.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;next-steps&quot;&gt;Next steps&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#next-steps&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If you use any of these features on the &lt;strong&gt;current stable&lt;/strong&gt; package, refer to the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/guides/2026-deprecation/&quot;&gt;2026 deprecation migration guide&lt;/a&gt;. Coding agents can use the &lt;strong&gt;&lt;code&gt;sandbox-stable&lt;/code&gt;&lt;/strong&gt; skill for stable-package work and that guide for cleanup (&lt;a href=&quot;https://developers.cloudflare.com/agent-setup/&quot;&gt;Agent setup&lt;/a&gt; · &lt;a href=&quot;https://github.com/cloudflare/skills&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Skills&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;If you are moving to &lt;strong&gt;Sandbox SDK 1.0&lt;/strong&gt; (&lt;code&gt;@next&lt;/code&gt;), use the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/1-0-preview/&quot;&gt;1.0 preview&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/sandbox/1-0-preview/migrate/&quot;&gt;Migrate&lt;/a&gt; guides instead — or the &lt;strong&gt;&lt;code&gt;sandbox-migrate-to-next&lt;/code&gt;&lt;/strong&gt; skill after installing Cloudflare Skills. New projects should prefer &lt;strong&gt;&lt;code&gt;sandbox-next&lt;/code&gt;&lt;/strong&gt; on &lt;code&gt;@next&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For any questions, ask in the &lt;a href=&quot;https://discord.gg/cloudflaredev&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Developers Discord&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><product>Sandbox SDK</product><category>Sandbox SDK</category></item><item><title>WAF - WAF Release - 2026-06-09</title><link>https://developers.cloudflare.com/changelog/post/2026-06-09-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-09-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;b4f88cb767874def810edd0b387cf935&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...387cf935&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Axios - Prototype Pollution - CVE:CVE-2026-40175&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;098997bb8b5f48abb4039bd6417eb9e0&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...417eb9e0&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Drupal - PostgreSQL SQLi - CVE:CVE-2026-9082 - Body&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;8a7650b99ec04a91a19b8295fd3857fd&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...fd3857fd&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Drupal - PostgreSQL SQLi - CVE:CVE-2026-9082 - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;525c0871787840e6a6193f6caee241d2&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...aee241d2&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Obfuscated Boolean - Body&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;1ec4aeaf7900463397b82b35d8620070&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d8620070&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Obfuscated Boolean - Headers&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;fb74766654c44ff2a5204dc4e0be4d47&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...e0be4d47&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Mirasvit Cache Warmer - PHP Object Injection - CVE:CVE-2026-45247&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Email Service - Authenticated SMTP submission now available in beta</title><link>https://developers.cloudflare.com/changelog/post/2026-06-08-smtp-submission/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-08-smtp-submission/</guid><description>&lt;p&gt;You can now send emails through &lt;strong&gt;Cloudflare Email Service&lt;/strong&gt; using authenticated &lt;a href=&quot;https://developers.cloudflare.com/email-service/api/send-emails/smtp/&quot;&gt;SMTP submission&lt;/a&gt; on &lt;code&gt;smtp.mx.cloudflare.net:465&lt;/code&gt;. SMTP joins the &lt;a href=&quot;https://developers.cloudflare.com/email-service/api/send-emails/rest-api/&quot;&gt;REST API&lt;/a&gt; and the &lt;a href=&quot;https://developers.cloudflare.com/email-service/api/send-emails/workers-api/&quot;&gt;Workers binding&lt;/a&gt; as a third way to send transactional email — useful for existing applications that already speak SMTP and language-native SMTP libraries (Nodemailer, &lt;code&gt;smtplib&lt;/code&gt;, PHPMailer, JavaMail).&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Host&lt;/td&gt;
&lt;td&gt;&lt;code&gt;smtp.mx.cloudflare.net&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Port&lt;/td&gt;
&lt;td&gt;&lt;code&gt;465&lt;/code&gt; (implicit TLS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AUTH&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PLAIN&lt;/code&gt; or &lt;code&gt;LOGIN&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Username&lt;/td&gt;
&lt;td&gt;&lt;code&gt;api_token&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Password&lt;/td&gt;
&lt;td&gt;A Cloudflare API token (account-owned or user-owned) with &lt;strong&gt;Email Sending: Edit&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Submissions enter the same delivery pipeline as the REST API and Workers binding: identical &lt;a href=&quot;https://developers.cloudflare.com/email-service/platform/limits/&quot;&gt;limits&lt;/a&gt;, automatic DKIM and ARC signing, and shared dashboard logs.&lt;/p&gt;
&lt;p&gt;Send your first email with a single command:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --ssl-reqd&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --url&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;smtps://smtp.mx.cloudflare.net:465&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --user&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;api_token:&amp;lt;API_TOKEN&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --mail-from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;welcome@yourdomain.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --mail-rcpt&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;user@example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --upload-file&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; mail.txt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/email-service/api/send-emails/smtp/&quot;&gt;SMTP reference&lt;/a&gt; for authentication details, response codes, and language-specific examples.&lt;/p&gt;</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><product>Email Service</product><category>Email Service</category></item><item><title>R2 SQL - R2 SQL now supports UNION, INTERSECT, EXCEPT, and SELECT DISTINCT</title><link>https://developers.cloudflare.com/changelog/post/2026-06-05-union-intersect-except-select-distinct/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-05-union-intersect-except-select-distinct/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; now supports set operations (&lt;code&gt;UNION&lt;/code&gt;, &lt;code&gt;INTERSECT&lt;/code&gt;, &lt;code&gt;EXCEPT&lt;/code&gt;) and &lt;code&gt;SELECT DISTINCT&lt;/code&gt;, expanding the range of analytical queries you can run directly on &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables in &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;set-operations&quot;&gt;Set operations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#set-operations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Combine the results of multiple &lt;code&gt;SELECT&lt;/code&gt; statements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;UNION&lt;/code&gt;&lt;/strong&gt; — returns all rows from both queries, removing duplicates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;UNION ALL&lt;/code&gt;&lt;/strong&gt; — returns all rows from both queries, including duplicates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;INTERSECT&lt;/code&gt;&lt;/strong&gt; — returns only rows that appear in both queries&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;EXCEPT&lt;/code&gt;&lt;/strong&gt; — returns rows from the first query that do not appear in the second&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Find zones that had either firewall blocks OR high-risk requests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;firewall_events&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; action&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;block&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;UNION&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;http_requests&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; risk_score &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Find zones with both firewall blocks AND high traffic&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;firewall_events&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; action&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;block&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;INTERSECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;http_requests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;HAVING&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Find enterprise zones that have not been compacted&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zones&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; plan &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;enterprise&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;EXCEPT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;compaction_history&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;select-distinct&quot;&gt;Select distinct&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#select-distinct&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Eliminate duplicate rows from query results:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT DISTINCT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region, department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; total_amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region, department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 100&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For large datasets where approximate results are acceptable, &lt;code&gt;approx_distinct()&lt;/code&gt; remains a faster alternative for counting unique values.&lt;/p&gt;
&lt;p&gt;For the full syntax reference, refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. For performance guidance, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/&quot;&gt;Limitations and best practices&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Realtime - Post-meeting transcriptions are now Generally Available in RealtimeKit</title><link>https://developers.cloudflare.com/changelog/post/2026-06-08-realtimekit-post-meeting-transcription-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-08-realtimekit-post-meeting-transcription-ga/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/&quot;&gt;RealtimeKit&lt;/a&gt; lets you build products where people meet over live audio and video — such as HealthTech, EdTech, proctoring, and other real-time platforms — on Cloudflare&apos;s &lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/calls-vs-sfus/&quot;&gt;global WebRTC infrastructure&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/#post-meeting-transcription&quot;&gt;Post-meeting transcription&lt;/a&gt; is now Generally Available, so completed RealtimeKit meetings can automatically produce full transcript files after they end. Those transcripts can also power &lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/ai/summary/&quot;&gt;AI-generated summaries&lt;/a&gt; for meeting notes, review workflows, and follow-up tasks after the transcript is available.&lt;/p&gt;
&lt;p&gt;Post-meeting transcription is a managed service powered by &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt; using &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/whisper-large-v3-turbo/&quot;&gt;Whisper Large v3 Turbo&lt;/a&gt;. RealtimeKit handles transcription processing and can return transcript and summary files through &lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/webhooks/&quot;&gt;webhooks&lt;/a&gt; or the REST API, so you do not need to run your own transcription infrastructure.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;generate-transcripts-and-summaries&quot;&gt;Generate transcripts and summaries&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#generate-transcripts-and-summaries&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To generate a transcript after a meeting ends, set &lt;code&gt;transcribe_on_end: true&lt;/code&gt; when &lt;a href=&quot;https://developers.cloudflare.com/api/resources/realtime_kit/subresources/meetings/methods/create/&quot;&gt;creating a meeting&lt;/a&gt;. To also generate an AI summary automatically after the transcript is available, set &lt;code&gt;summarize_on_end: true&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/realtime/kit/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/meetings&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;title&quot;: &quot;Weekly product review&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;transcribe_on_end&quot;: true,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;summarize_on_end&quot;: true,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;ai_config&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;transcription&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;language&quot;: &quot;en&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;summarization&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;word_limit&quot;: 500,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;text_format&quot;: &quot;markdown&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;summary_type&quot;: &quot;team_meeting&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;consume-results&quot;&gt;Consume results&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#consume-results&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When RealtimeKit finishes processing a meeting, it creates download URLs for the transcript and, if &lt;code&gt;summarize_on_end&lt;/code&gt; is set, the summary. You can receive those URLs automatically with &lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/webhooks/&quot;&gt;webhooks&lt;/a&gt;, or fetch them later for a specific session with the &lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/ai/summary/#rest-api&quot;&gt;REST API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To receive results as soon as they are ready, configure the &lt;code&gt;meeting.transcript&lt;/code&gt; and &lt;code&gt;meeting.summary&lt;/code&gt; webhook events:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/realtime/kit/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/webhooks&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;name&quot;: &quot;AI results webhook&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;url&quot;: &quot;https://example.com/webhook&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;events&quot;: [&quot;meeting.transcript&quot;, &quot;meeting.summary&quot;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;enabled&quot;: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To fetch results later, call the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/realtime_kit/subresources/sessions/methods/get_session_transcripts/&quot;&gt;transcript&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/api/resources/realtime_kit/subresources/sessions/methods/get_session_summary/&quot;&gt;summary&lt;/a&gt; endpoint for the session:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; GET&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/realtime/kit/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/sessions/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$SESSION_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/transcript&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; GET&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/realtime/kit/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/sessions/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$SESSION_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/summary&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Use the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/realtime_kit/subresources/sessions/methods/generate_summary_of_transcripts/&quot;&gt;Generate summary of transcripts for the session&lt;/a&gt; API only if &lt;code&gt;summarize_on_end&lt;/code&gt; was not set and you want to generate a summary manually after the transcript is available:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/realtime/kit/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$APP_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/sessions/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$SESSION_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/summary&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Post-meeting transcription supports &lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/#output-formats&quot;&gt;CSV, JSON, SRT, and VTT transcript outputs&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/#post-meeting-supported-languages&quot;&gt;automatic language detection and Whisper language codes&lt;/a&gt;. RealtimeKit also supports &lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/#real-time-transcription&quot;&gt;real-time transcription&lt;/a&gt; with &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/nova-3/&quot;&gt;Deepgram Nova-3&lt;/a&gt; for live captions, in-meeting accessibility, and real-time note-taking.&lt;/p&gt;
&lt;p&gt;Learn more in the &lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/&quot;&gt;RealtimeKit transcription docs&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/ai/summary/&quot;&gt;summary docs&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><product>Realtime</product><category>Realtime</category></item><item><title>Security Center - Create WAF rules directly from Threat Events saved views</title><link>https://developers.cloudflare.com/changelog/post/2026-06-08-create-waf-rules-from-threat-events/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-08-create-waf-rules-from-threat-events/</guid><description>&lt;p&gt;Cloudforce One users can now turn &lt;a href=&quot;https://developers.cloudflare.com/security-center/cloudforce-one/#analyze-threat-events&quot;&gt;Threat Events indicators&lt;/a&gt; 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 &lt;strong&gt;Saved Views&lt;/strong&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;why-this-matters&quot;&gt;Why this matters&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#why-this-matters&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;how-to-use-it&quot;&gt;How to use it&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#how-to-use-it&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can implement these rules through both the dashboard UI and via the API / Terraform.&lt;/p&gt;
&lt;p&gt;Go to &lt;strong&gt;Cloudflare Dashboard&lt;/strong&gt; &amp;gt; &lt;strong&gt;Application Security&lt;/strong&gt; &amp;gt; &lt;strong&gt;Threat Intelligence&lt;/strong&gt; &amp;gt; &lt;strong&gt;Manage Views&lt;/strong&gt;, select your desired view, and select &lt;strong&gt;Create WAF Rule&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This will automatically pre-populate the &lt;a href=&quot;https://developers.cloudflare.com/firewall/cf-dashboard/create-edit-delete-rules/&quot;&gt;WAF rule builder&lt;/a&gt; with the matching threat event IP indicators.&lt;/p&gt;
&lt;p&gt;You can also automate this workflow by utilizing the &lt;a href=&quot;https://developers.cloudflare.com/firewall/api/cf-firewall-rules/&quot;&gt;&lt;strong&gt;WAF Rule Builder API&lt;/strong&gt;&lt;/a&gt; alongside your &lt;a href=&quot;https://developers.cloudflare.com/firewall/api/cf-firewall-rules/&quot;&gt;Threat Events saved views endpoints&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Security Center - Introducing Threat Actor Profiles in Threat Events</title><link>https://developers.cloudflare.com/changelog/post/2026-06-08-threat-actor-profiles/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-08-threat-actor-profiles/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; We’ve launched &lt;strong&gt;Threat Actor Profiles&lt;/strong&gt; directly inside the Threat Events dashboard. You can now immediately pivot from a generic alert or blocked event to a profile that unmasks the &quot;Who, Why, and How&quot; behind a threat event.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;why-this-matters&quot;&gt;Why this matters&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#why-this-matters&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Security teams often suffer from a visibility gap. When an attack is blocked, it&apos;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Every profile provides clear strategic and tactical modules including alternative aliases, origin tracking, historical threat event volume, and MITRE ATT&amp;amp;CK mapping detailing the adversary&apos;s technical methods.&lt;/li&gt;
&lt;li&gt;You can search the dedicated threat actor directory or click an actor&apos;s name inside any threat event to view all details and related events to the specific threat actor.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;how-to-use-it&quot;&gt;How to use it&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#how-to-use-it&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Adversary tracking is now available in the Cloudflare Dashbboard and ready to be included in your daily investigation workflow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click on the &lt;strong&gt;Threat Actor&lt;/strong&gt; name in the Threat Events table to open their full identity profile and review their aliases and attack stats.&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Cloudflare Dashboard &amp;gt; Application Security &amp;gt; Threat Intelligence&lt;/strong&gt; to explore the new &lt;strong&gt;Threat Actors&lt;/strong&gt; tab. Here, you can browse a card-based directory of all established entities tracked by Cloudforce One.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Learn more in the &lt;a href=&quot;https://developers.cloudflare.com/security-center/cloudforce-one/#identify-the-adversary&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudforce One documentation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Workflows - Rollback support now available in Workflows</title><link>https://developers.cloudflare.com/changelog/post/2026-06-05-saga-rollbacks/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-05-saga-rollbacks/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt; now supports saga-style rollbacks,  allowing you to add compensating logic to each &lt;code&gt;step.do()&lt;/code&gt; in case of downstream failures. If the instance fails, the rollback handlers will execute in reverse &lt;code&gt;step-start&lt;/code&gt; order.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;catch&lt;/code&gt;, you can keep each compensating action next to the step it undoes.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;provision resource&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; provisionResource&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { resourceId: resource.id };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		rollback&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;resourceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; output;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; deleteResource&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(resourceId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		rollbackConfig: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			retries: { limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, delay: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;15 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, backoff: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;linear&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2 minutes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;provision resource&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; provisionResource&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { resourceId: resource.id };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		rollback&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;resourceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; output &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;resourceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; deleteResource&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(resourceId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		rollbackConfig: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			retries: { limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, delay: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;15 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, backoff: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;linear&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2 minutes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/workers-api/#rollback-options&quot;&gt;rollback options&lt;/a&gt; to learn more.&lt;/p&gt;</description><pubDate>Fri, 05 Jun 2026 15:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>AI Gateway - Control AI costs with spend limits</title><link>https://developers.cloudflare.com/changelog/post/2026-06-05-spend-limits/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-05-spend-limits/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Spend limits work with both &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/features/unified-billing/&quot;&gt;Unified Billing&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/configuration/bring-your-own-keys/&quot;&gt;BYOK&lt;/a&gt; requests for models with known pricing.&lt;/p&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/features/spend-limits/&quot;&gt;Spend limits documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Radar - Finer-grained chart granularity on Cloudflare Radar for longer time ranges</title><link>https://developers.cloudflare.com/changelog/post/2026-06-05-radar-traffic-chart-granularity/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-05-radar-traffic-chart-granularity/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;The new defaults are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1-3 months&lt;/strong&gt;: daily granularity (7x more data points)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Longer than 3 months&lt;/strong&gt; (HTTP and NetFlows): weekly granularity (4x more data points)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, a 12-week traffic view previously showed weekly data:&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=878,format=webp/_astro/traffic-granularity-12w-before.OlJmS6Ts.png&quot; alt=&quot;Traffic trends chart with weekly granularity for a 12-week view&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;878&quot;&gt;
&lt;p&gt;The same view now shows daily data:&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=878,format=webp/_astro/traffic-granularity-12w-after.DL8mxwQ3.png&quot; alt=&quot;Traffic trends chart with daily granularity for a 12-week view&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;878&quot;&gt;
&lt;p&gt;Similarly, a 1-year HTTP traffic view that previously showed just 12 monthly data points now provides 52 weekly data points.&lt;/p&gt;
&lt;p&gt;Visit &lt;a href=&quot;https://radar.cloudflare.com/?dateRange=12w#traffic-trends&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Radar&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to explore the new granular views.&lt;/p&gt;</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Gateway, Cloudflare Mesh, Workers VPC - Filter Workers&apos; public Internet traffic using Gateway policies</title><link>https://developers.cloudflare.com/changelog/post/2026-06-05-gateway-egress/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-05-gateway-egress/</guid><description>
&lt;p&gt;Workers using a &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/&quot;&gt;VPC Network&lt;/a&gt; binding with &lt;code&gt;network_id: &quot;cf1:network&quot;&lt;/code&gt; now egress to public Internet destinations through &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot;&gt;Cloudflare Gateway&lt;/a&gt;. 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.&lt;/p&gt;
&lt;figure class=&quot;vpc-egress-diagram not-content&quot; aria-label=&quot;Workers VPC public Internet egress through Cloudflare Mesh and Cloudflare Gateway&quot; data-astro-cid-lmo6yva7&gt;&lt;ol class=&quot;flow&quot; data-astro-cid-lmo6yva7&gt;&lt;li class=&quot;flow-step&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-card worker-card&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-header&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;node-icon worker-icon&quot; aria-hidden=&quot;true&quot; data-astro-cid-lmo6yva7&gt;&lt;svg width=&quot;0.98em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 48 49&quot; data-astro-cid-lmo6yva7=&quot;true&quot; data-icon=&quot;workers&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M21.997 6.503h-3.712l13.387 18.3-13.072 17.7h3.735L35.4 24.81z&quot;/&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M29.175 6.503h-3.758l13.598 18.082-13.598 17.918h3.765l12.908-17.01v-1.808z&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;a class=&quot;node-title&quot; href=&quot;https://developers.cloudflare.com/workers/&quot; data-astro-cid-lmo6yva7&gt;Worker&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;node-caption&quot; data-astro-cid-lmo6yva7&gt;Calls &lt;code data-astro-cid-lmo6yva7&gt;env.EGRESS.fetch()&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;flow-connector&quot; data-astro-cid-lmo6yva7&gt;&lt;a class=&quot;connector-label&quot; href=&quot;https://developers.cloudflare.com/workers-vpc/&quot; data-astro-cid-lmo6yva7&gt;VPC binding&lt;/a&gt;&lt;span class=&quot;connector-arrow&quot; aria-hidden=&quot;true&quot; data-astro-cid-lmo6yva7&gt;↓&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;flow-step&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-card mesh-card&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-header&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;node-icon mesh-icon&quot; aria-hidden=&quot;true&quot; data-astro-cid-lmo6yva7&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 32 32&quot; data-astro-cid-lmo6yva7=&quot;true&quot; data-icon=&quot;cloudflare-mesh&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;a class=&quot;node-title&quot; href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot; data-astro-cid-lmo6yva7&gt;Cloudflare Mesh&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;node-caption&quot; data-astro-cid-lmo6yva7&gt;Bind via &lt;a class=&quot;inline-pill mesh-pill&quot; href=&quot;https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/&quot; data-astro-cid-lmo6yva7&gt;&lt;code data-astro-cid-lmo6yva7&gt;cf1:network&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;flow-connector&quot; aria-hidden=&quot;true&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;connector-arrow&quot; data-astro-cid-lmo6yva7&gt;↓&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;flow-step&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-card gateway-card&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-header&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;node-icon gateway-icon&quot; aria-hidden=&quot;true&quot; data-astro-cid-lmo6yva7&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 16 16&quot; data-astro-cid-lmo6yva7=&quot;true&quot; data-icon=&quot;gateway&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;M8.453 7.238H0l.517.87H8.97zM9.21 8.51H.755l.517.868h8.453z&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;a class=&quot;node-title&quot; href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot; data-astro-cid-lmo6yva7&gt;Cloudflare Gateway&lt;/a&gt;&lt;/div&gt;&lt;p class=&quot;node-caption&quot; data-astro-cid-lmo6yva7&gt;Policies applied:&lt;/p&gt;&lt;div class=&quot;pill-row&quot; data-astro-cid-lmo6yva7&gt;&lt;a class=&quot;policy-pill&quot; href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/dns-policies/&quot; data-astro-cid-lmo6yva7&gt;DNS&lt;/a&gt;&lt;a class=&quot;policy-pill&quot; href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/&quot; data-astro-cid-lmo6yva7&gt;HTTP&lt;/a&gt;&lt;a class=&quot;policy-pill&quot; href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/&quot; data-astro-cid-lmo6yva7&gt;Network&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li class=&quot;flow-connector&quot; aria-hidden=&quot;true&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;connector-arrow&quot; data-astro-cid-lmo6yva7&gt;↓&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;flow-step&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-card internet-card&quot; data-astro-cid-lmo6yva7&gt;&lt;div class=&quot;node-header&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;node-icon internet-icon&quot; aria-hidden=&quot;true&quot; data-astro-cid-lmo6yva7&gt;↗&lt;/span&gt;&lt;span class=&quot;node-title&quot; data-astro-cid-lmo6yva7&gt;Public Internet&lt;/span&gt;&lt;/div&gt;&lt;p class=&quot;node-caption&quot; data-astro-cid-lmo6yva7&gt;Any public hostname or IP&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;a class=&quot;logs-card&quot; href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/logs/dashboard-logs/gateway-logs/&quot; aria-label=&quot;Gateway logs&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;logs-title&quot; data-astro-cid-lmo6yva7&gt;Gateway logs&lt;/span&gt;&lt;span class=&quot;logs-pills&quot; data-astro-cid-lmo6yva7&gt;&lt;span class=&quot;logs-pill&quot; data-astro-cid-lmo6yva7&gt;DNS&lt;/span&gt;&lt;span class=&quot;logs-pill&quot; data-astro-cid-lmo6yva7&gt;HTTP&lt;/span&gt;&lt;span class=&quot;logs-pill&quot; data-astro-cid-lmo6yva7&gt;Network&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;What you get by default:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Visibility.&lt;/strong&gt; Worker egress shows up in Gateway &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/dns-policies/&quot;&gt;DNS&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/&quot;&gt;HTTP&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/&quot;&gt;Network&lt;/a&gt; logs alongside your other traffic, so you can audit what your Workers are calling and when.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enforcement.&lt;/strong&gt; 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.&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;vpc_networks&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;EGRESS&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;network_id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf1:network&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;remote&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;vpc_networks&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;EGRESS&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;network_id = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf1:network&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;remote = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Egress to a public destination — subject to your Gateway policies and logged&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;EGRESS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://api.example.com/data&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Egress to a public destination — subject to your Gateway policies and logged&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;EGRESS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://api.example.com/data&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;For configuration options, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/&quot;&gt;VPC Networks&lt;/a&gt;. For policy authoring, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot;&gt;Cloudflare Gateway traffic policies&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category><category>Cloudflare Mesh</category><category>Workers VPC</category></item><item><title>Access - Share identity providers across accounts with IdP federation</title><link>https://developers.cloudflare.com/changelog/post/2026-06-04-idp-federation/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-04-idp-federation/</guid><description>&lt;p&gt;Cloudflare Access now supports &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/idp-federation/&quot;&gt;IdP federation&lt;/a&gt;, which allows organizations to share a single identity provider across multiple Cloudflare accounts.&lt;/p&gt;
&lt;p&gt;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&apos;s Access policies evaluate the resulting identity just like any other IdP login.&lt;/p&gt;
&lt;p&gt;Key capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;One IdP, many accounts&lt;/strong&gt; — Configure your IdP once and share it with all accounts in your organization.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lifecycle management&lt;/strong&gt; — As accounts join or leave your Cloudflare organization, their IdP connections are provisioned and removed automatically — no manual cleanup required.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Immutable recipient connections&lt;/strong&gt; — IdP connections in recipient accounts cannot be accidentally modified or deleted.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/idp-federation/&quot;&gt;IdP federation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Cloudflare Fundamentals, Workers, D1, R2, KV, Queues, Vectorize, Durable Objects, Containers - Billable usage and budget alerts now in product sidebars</title><link>https://developers.cloudflare.com/changelog/post/2026-06-04-billable-usage-product-sidebar/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-04-billable-usage-product-sidebar/</guid><description>&lt;p&gt;Pay-as-you-go customers can now view billable usage and create &lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-04-13-billable-usage-dashboard-and-budget-alerts/&quot;&gt;budget alerts&lt;/a&gt; directly from the product overview pages for &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Workers &amp;amp; Pages&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/d1/&quot;&gt;D1&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/kv/&quot;&gt;Workers KV&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/queues/&quot;&gt;Queues&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/vectorize/&quot;&gt;Vectorize&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt;. A new sidebar widget shows current-period spend and the billing cycle date range, alongside a button to create a budget alert.&lt;/p&gt;
&lt;p&gt;The widget pulls from the same data as the &lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-04-13-billable-usage-dashboard-and-budget-alerts/&quot;&gt;Billable Usage dashboard&lt;/a&gt; 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.&lt;/p&gt;
&lt;img src=&quot;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&quot; alt=&quot;Billable usage widget in the Durable Objects product sidebar showing current-period spend and a breakdown by service&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2872&quot; height=&quot;1614&quot;&gt;
&lt;p&gt;Selecting &lt;strong&gt;Create budget alert&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/billing/&quot;&gt;Usage-based billing documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>Workers</category><category>D1</category><category>R2</category><category>KV</category><category>Queues</category><category>Vectorize</category><category>Durable Objects</category><category>Containers</category></item><item><title>Pipelines, Workers - Pipeline binding configuration field renamed to stream</title><link>https://developers.cloudflare.com/changelog/post/2026-05-27-pipeline-binding-stream-field/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-27-pipeline-binding-stream-field/</guid><description>
&lt;p&gt;The &lt;code&gt;pipeline&lt;/code&gt; field inside the &lt;code&gt;pipelines&lt;/code&gt; binding configuration in your &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/&quot;&gt;Wrangler configuration file&lt;/a&gt; has been renamed to &lt;code&gt;stream&lt;/code&gt;. The old field is deprecated but still accepted.&lt;/p&gt;
&lt;p&gt;Update your configuration to use &lt;code&gt;stream&lt;/code&gt; to avoid the deprecation warning.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Before (deprecated):&lt;/strong&gt;&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;pipelines&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_PIPELINE&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;pipeline&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;STREAM_ID&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;pipelines&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_PIPELINE&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;pipeline = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;STREAM_ID&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;pipelines&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_PIPELINE&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;stream&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;STREAM_ID&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;pipelines&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_PIPELINE&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;stream = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;STREAM_ID&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;No other changes are required. The binding name, TypeScript types, and runtime API (&lt;code&gt;env.MY_PIPELINE.send(...)&lt;/code&gt;) remain the same.&lt;/p&gt;
&lt;p&gt;For more information on configuring pipeline bindings, refer to &lt;a href=&quot;https://developers.cloudflare.com/pipelines/streams/writing-to-streams/#configure-pipeline-binding&quot;&gt;Writing to streams&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><product>Pipelines</product><category>Pipelines</category><category>Workers</category></item><item><title>Access - SAML assertion encryption for identity providers</title><link>https://developers.cloudflare.com/changelog/post/2026-06-03-saml-assertion-encryption/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-03-saml-assertion-encryption/</guid><description>&lt;p&gt;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&apos;s browser. Only Access can decrypt these assertions, protecting sensitive identity data even after TLS termination.&lt;/p&gt;
&lt;p&gt;Without encryption, SAML assertions are transmitted in plaintext and could be visible to browser extensions or client-side malware.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1698,height=344,format=webp/_astro/saml-encryption.J5jmiYv8.png&quot; alt=&quot;SAML encryption toggle in the identity provider configuration&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1698&quot; height=&quot;344&quot;&gt;
&lt;p&gt;SAML encryption includes built-in certificate lifecycle management:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatic certificate generation&lt;/strong&gt;: Access generates an encryption certificate when you turn on SAML encryption for an identity provider.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Certificate rotation&lt;/strong&gt;: Rotate certificates without downtime. The previous certificate remains valid until expiration, giving you time to update your IdP.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PEM export&lt;/strong&gt;: Copy the certificate in PEM format for manual upload to your IdP, or point your IdP to the SAML metadata endpoint for automatic retrieval.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/generic-saml/#encrypt-saml-assertions&quot;&gt;Encrypt SAML assertions&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Cloudflare Fundamentals - Introducing self-managed OAuth clients</title><link>https://developers.cloudflare.com/changelog/post/2026-06-03-public-oauth-clients/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-03-public-oauth-clients/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-is-new&quot;&gt;What is new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-is-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Cloudflare Developers can now create and manage their own OAuth applications to integrate with Cloudflare.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;create-an-application&quot;&gt;Create an application&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#create-an-application&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To create an application, go to &lt;strong&gt;Manage account&lt;/strong&gt; &amp;gt; &lt;strong&gt;OAuth clients&lt;/strong&gt; in your account on the Cloudflare dashboard.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/oauth-clients&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;OAuth clients&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;select-limited-scopes&quot;&gt;Select limited scopes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#select-limited-scopes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Users can review the requested scopes before they consent.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;apps-for-both-private-and-public-use&quot;&gt;Apps for both private and public use&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#apps-for-both-private-and-public-use&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Applications start with &lt;code&gt;private&lt;/code&gt; visibility. Private applications can only be used by members of the account where the application was created.&lt;/p&gt;
&lt;p&gt;To make an application available to any Cloudflare user, complete the prerequisites for &lt;code&gt;public&lt;/code&gt; visibility.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/oauth/create-an-oauth-client/#private-and-public-clients&quot;&gt;client visibility&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;client-domain-verification&quot;&gt;Client domain verification&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#client-domain-verification&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;After verification, users see a verified badge on the consent page.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/oauth/create-an-oauth-client/#client-url-domain-ownership-verification&quot;&gt;domain verification&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;learn-more&quot;&gt;Learn more&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#learn-more&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/oauth/&quot;&gt;OAuth clients&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Workers - New Workers bulk secrets API endpoint</title><link>https://developers.cloudflare.com/changelog/post/2026-06-03-bulk-secrets-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-03-bulk-secrets-api/</guid><description>&lt;p&gt;You can now create, update, or delete multiple secrets for your Worker in a single request using the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/secrets/methods/bulk_update/&quot;&gt;bulk secrets endpoint&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Include a secret with a value to create or update.&lt;/li&gt;
&lt;li&gt;Set a secret to &lt;code&gt;null&lt;/code&gt; to delete.&lt;/li&gt;
&lt;li&gt;Secrets not included in the request are left unchanged.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following example creates &lt;code&gt;API_KEY&lt;/code&gt;, updates the already existing &lt;code&gt;DB_PASSWORD&lt;/code&gt;, and deletes &lt;code&gt;OLD_SECRET&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;secrets&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;API_KEY&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;secret_text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;API_KEY&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-api-key&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;DB_PASSWORD&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;secret_text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;DB_PASSWORD&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-db-password&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;OLD_SECRET&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;You can do the same from the command line using &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/workers/#secret-bulk&quot;&gt;&lt;code&gt;wrangler secret bulk&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; secret&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; bulk&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; secrets.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To delete a key, set its value to &lt;code&gt;null&lt;/code&gt; in the JSON file. Deletion is not supported with &lt;code&gt;.env&lt;/code&gt; files.&lt;/p&gt;
&lt;p&gt;Each request supports up to &lt;strong&gt;100 total operations&lt;/strong&gt; (creates, updates, and deletes combined).&lt;/p&gt;</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Store Wrangler&apos;s OAuth credentials in your OS keychain</title><link>https://developers.cloudflare.com/changelog/post/2026-06-03-wrangler-keyring-credential-storage/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-03-wrangler-keyring-credential-storage/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt; can now store the OAuth credentials returned by &lt;code&gt;wrangler login&lt;/code&gt; in an &lt;a href=&quot;https://en.wikipedia.org/wiki/Galois/Counter_Mode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AES-256-GCM&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;-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.&lt;/p&gt;
&lt;p&gt;To opt in, run:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; login&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --use-keyring&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;The choice is persisted across Wrangler invocations. Opt back out with &lt;code&gt;npx wrangler login --no-use-keyring&lt;/code&gt;, or override the preference for a single command with the &lt;code&gt;CLOUDFLARE_AUTH_USE_KEYRING&lt;/code&gt; environment variable.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wrangler whoami&lt;/code&gt; now reports where credentials are stored:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;🔐&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Credentials&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; are&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; stored&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; in:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Encrypted&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; file&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (~/.config/.wrangler/config/default.enc) with key in macOS Keychain (service&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;wrangler,&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; account&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Per-platform backends:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt; uses the built-in Keychain via &lt;code&gt;/usr/bin/security&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux&lt;/strong&gt; uses &lt;a href=&quot;https://wiki.gnome.org/Projects/Libsecret&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;libsecret&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; via the &lt;code&gt;secret-tool&lt;/code&gt; CLI from the &lt;code&gt;libsecret-tools&lt;/code&gt; package.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt; uses Credential Manager via &lt;a href=&quot;https://www.npmjs.com/package/@napi-rs/keyring&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@napi-rs/keyring&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, installed on-demand the first time you opt in.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#storing-oauth-credentials-in-the-os-keychain&quot;&gt;Storing OAuth credentials in the OS keychain&lt;/a&gt; for the full details, including the migration behavior on opt-in/opt-out and the &lt;code&gt;CLOUDFLARE_AUTH_USE_KEYRING&lt;/code&gt; environment variable.&lt;/p&gt;</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workflows, Workers - Schedule Workflow instances directly from your Workflow binding</title><link>https://developers.cloudflare.com/changelog/post/2026-06-02-cron-workflows/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-02-cron-workflows/</guid><description>&lt;p&gt;You can now attach cron schedules directly to a Workflow binding in &lt;code&gt;wrangler.jsonc&lt;/code&gt;. Each scheduled run creates a new Workflow instance automatically, so you do not need to define a separate Worker with a &lt;code&gt;scheduled&lt;/code&gt; handler just to trigger your Workflow on an interval.&lt;/p&gt;
&lt;p&gt;For example, you can configure hourly, every-15-minute, or weekday schedules on the same Workflow:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-scheduled-workflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_WORKFLOW&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;class_name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MyScheduledWorkflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;schedules&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;0 * * * *&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;*/15 * * * *&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;0 9 * * MON-FRI&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Cron workloads get all the same benefits of Workflows with built-in retries, multi-step durable execution, and configurable timeouts of Workflows.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	WorkflowEntrypoint,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	WorkflowEvent,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	WorkflowStep,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Runs automatically on each cron schedule defined for the MY_WORKFLOW binding in wrangler.jsonc.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyScheduledWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowEvent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowStep&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;fetch source data&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetchSourceData&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// If this step fails, only this step is retried with the custom logic below&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;process and store results&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				retries: { limit: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, delay: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;30 seconds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, backoff: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;exponential&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;10 minutes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; processAndStore&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(data);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/trigger-workflows/&quot;&gt;Trigger Workflows&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 02 Jun 2026 15:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Agents, Workers - Agents SDK v0.14.0: Agent Skills, messengers, scheduled tasks, Workflows, and hardened chat recovery</title><link>https://developers.cloudflare.com/changelog/post/2026-06-02-agents-sdk-v0.14.0/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-02-agents-sdk-v0.14.0/</guid><description>
&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; adds four new ways to build with &lt;code&gt;@cloudflare/think&lt;/code&gt;: 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;agent-skills-experimental&quot;&gt;Agent Skills (experimental)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#agent-skills-experimental&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think, skills } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; bundledSkills &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents:skills&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; SkillsAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	getSkills&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			bundledSkills,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			skills.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;SKILLS_BUCKET&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { prefix: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;skills/&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think, skills } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; bundledSkills &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents:skills&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; SkillsAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	getSkills&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			bundledSkills,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			skills.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;SKILLS_BUCKET&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { prefix: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;skills/&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;agents:skills&lt;/code&gt; import bundles a local &lt;code&gt;./skills&lt;/code&gt; directory through the Agents Vite plugin (one directory per skill, each with a &lt;code&gt;SKILL.md&lt;/code&gt;). Skills can also load from R2 or a manifest. When skills are available, Think exposes &lt;code&gt;activate_skill&lt;/code&gt;, &lt;code&gt;read_skill_resource&lt;/code&gt;, and an optional &lt;code&gt;run_skill_script&lt;/code&gt; tool. Skill loading is resilient: a duplicate or failing source is skipped with a warning instead of breaking the agent.&lt;/p&gt;
&lt;p&gt;Agent Skills are &lt;strong&gt;experimental&lt;/strong&gt;, 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 &lt;a href=&quot;https://github.com/cloudflare/agents/discussions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents repository&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;messengers&quot;&gt;Messengers&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#messengers&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	defineMessengers,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	ThinkMessengerStateAgent,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think/messengers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; telegramMessenger &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think/messengers/telegram&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { ThinkMessengerStateAgent };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; SupportAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	getMessengers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineMessengers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			telegram: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;telegramMessenger&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				token: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;TELEGRAM_BOT_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				userName: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;support_bot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				secretToken: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;TELEGRAM_WEBHOOK_SECRET_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	defineMessengers,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	ThinkMessengerStateAgent,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think/messengers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; telegramMessenger &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think/messengers/telegram&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { ThinkMessengerStateAgent };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; SupportAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	getMessengers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineMessengers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			telegram: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;telegramMessenger&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				token: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;TELEGRAM_BOT_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				userName: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;support_bot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				secretToken: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;TELEGRAM_WEBHOOK_SECRET_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;scheduled-tasks&quot;&gt;Scheduled tasks&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#scheduled-tasks&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think, defineScheduledTasks } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DigestAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	getScheduledTasks&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineScheduledTasks&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			weeklyCommitReport: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				schedule: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;every week on monday at 09:00&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				prompt:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;					&quot;Compile my GitHub commits for the last week and summarize them.&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			workout: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				schedule: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;every day at 08:00 in Europe/London&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				prompt: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Start my workout.&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think, defineScheduledTasks } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DigestAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	getScheduledTasks&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineScheduledTasks&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			weeklyCommitReport: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				schedule: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;every week on monday at 09:00&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				prompt:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;					&quot;Compile my GitHub commits for the last week and summarize them.&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			workout: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				schedule: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;every day at 08:00 in Europe/London&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				prompt: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Start my workout.&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;think-workflows&quot;&gt;Think Workflows&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#think-workflows&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Run a model-driven reasoning step inside a Cloudflare Workflow with &lt;code&gt;ThinkWorkflow&lt;/code&gt; and &lt;code&gt;step.prompt()&lt;/code&gt;, with durable typed structured output, long waits, and approval gates.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { z } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;zod&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { ThinkWorkflow } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think/workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; draftSchema&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	title: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	summary: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	labels: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;()),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; TriageWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ThinkWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; draft&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;triage-issue&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			prompt: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Triage issue #${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;issueNumber&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			output: draftSchema,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;3 days&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;apply-labels&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.agent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;applyLabels&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(draft.labels);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { z } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;zod&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { ThinkWorkflow } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think/workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { ThinkWorkflowStep } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think/workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { AgentWorkflowEvent } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; draftSchema&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	title: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	summary: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	labels: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;()),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; TriageWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ThinkWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;TriageAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Params&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentWorkflowEvent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Params&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ThinkWorkflowStep&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; draft&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;prompt&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;triage-issue&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			prompt: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Triage issue #${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;issueNumber&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			output: draftSchema,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;3 days&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;apply-labels&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.agent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;applyLabels&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(draft.labels);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;production-hardening-for-durable-chat-recovery&quot;&gt;Production hardening for durable chat recovery&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#production-hardening-for-durable-chat-recovery&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Better recovery during deploys.&lt;/strong&gt; Turns now ride through continuous deploys and evictions without losing completed work or re-running tools that already ran.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A live &quot;recovering…&quot; signal.&lt;/strong&gt; &lt;code&gt;useAgentChat&lt;/code&gt; exposes a new &lt;code&gt;isRecovering&lt;/code&gt; flag, so a recovering turn shows progress instead of looking frozen. Most UIs render &lt;code&gt;isStreaming || isRecovering&lt;/code&gt; as &quot;busy&quot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stalled streams recover.&lt;/strong&gt; Set &lt;code&gt;chatStreamStallTimeoutMs&lt;/code&gt; to route a hung provider stream into the same recovery path instead of leaving an infinite spinner.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sub-agents re-attach.&lt;/strong&gt; On parent recovery, an in-flight &lt;code&gt;agentTool()&lt;/code&gt; child is re-attached to its result rather than abandoned and re-run, so long-running children no longer lose work under deploys.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;mcp-transport-improvements&quot;&gt;MCP transport improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#mcp-transport-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resumable streams&lt;/strong&gt; — In-flight tool calls over Server-Sent Events (SSE) survive a dropped connection. Clients reconnect with &lt;code&gt;Last-Event-ID&lt;/code&gt; and replay anything they missed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Readable server IDs&lt;/strong&gt; — &lt;code&gt;addMcpServer&lt;/code&gt; accepts an optional &lt;code&gt;id&lt;/code&gt;, so tools surface as readable keys (for example &lt;code&gt;tool_github_create_pull_request&lt;/code&gt;) instead of opaque connection IDs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better handling of concurrent requests&lt;/strong&gt; — Overlapping JSON-RPC requests are now correctly correlated to their responses across the HTTP and RPC transports.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;other-improvements&quot;&gt;Other improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#other-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Compaction&lt;/strong&gt; — A &lt;code&gt;Session&lt;/code&gt;&apos;s &lt;code&gt;tokenCounter&lt;/code&gt; now also drives the compaction boundary decision (&quot;what to compress&quot;), not just the fire/no-fire trigger.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;@cloudflare/worker-bundler&lt;/code&gt;&lt;/strong&gt; — Adds a &lt;code&gt;virtualModules&lt;/code&gt; option to &lt;code&gt;createWorker&lt;/code&gt; to provide in-memory module source during bundling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client-tool continuations&lt;/strong&gt; — Parallel tool results now coalesce into a single continuation, immediate resume requests attach to the pending continuation, and server-side &lt;code&gt;needsApproval&lt;/code&gt; continuations resume reliably after approval.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-f1597433-0dee-457e-bde8-23c3fa46774c-npm&quot; id=&quot;pm-tab-pm-f1597433-0dee-457e-bde8-23c3fa46774c-npm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-f1597433-0dee-457e-bde8-23c3fa46774c-yarn&quot; id=&quot;pm-tab-pm-f1597433-0dee-457e-bde8-23c3fa46774c-yarn&quot; data-nb-pm-tab class=&quot;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&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-f1597433-0dee-457e-bde8-23c3fa46774c-pnpm&quot; id=&quot;pm-tab-pm-f1597433-0dee-457e-bde8-23c3fa46774c-pnpm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-f1597433-0dee-457e-bde8-23c3fa46774c-bun&quot; id=&quot;pm-tab-pm-f1597433-0dee-457e-bde8-23c3fa46774c-bun&quot; data-nb-pm-tab class=&quot;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&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-f1597433-0dee-457e-bde8-23c3fa46774c-npm&quot; aria-labelledby=&quot;pm-tab-pm-f1597433-0dee-457e-bde8-23c3fa46774c-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-f1597433-0dee-457e-bde8-23c3fa46774c-yarn&quot; aria-labelledby=&quot;pm-tab-pm-f1597433-0dee-457e-bde8-23c3fa46774c-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-f1597433-0dee-457e-bde8-23c3fa46774c-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-f1597433-0dee-457e-bde8-23c3fa46774c-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-f1597433-0dee-457e-bde8-23c3fa46774c-bun&quot; aria-labelledby=&quot;pm-tab-pm-f1597433-0dee-457e-bde8-23c3fa46774c-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add agents@latest @cloudflare/think@latest @cloudflare/ai-chat@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/agents/runtime/&quot;&gt;Agents API reference&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/agents/communication-channels/chat/chat-agents/&quot;&gt;Chat agents documentation&lt;/a&gt; for more information.&lt;/p&gt;</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Cloudflare WAN, Cloudflare One - Cisco IOS XE</title><link>https://developers.cloudflare.com/changelog/post/2026-06-02-cisco-ios-xe/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-02-cisco-ios-xe/</guid><description>&lt;p&gt;The Cisco IOS XE third-party integration guide for Cloudflare WAN has been updated to include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Post Quantum Cryptography (PQC)&lt;/li&gt;
&lt;li&gt;Policy-Based Routing (PBR)&lt;/li&gt;
&lt;li&gt;IP Service Level Agreement (IP SLA)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This link will take you directly to the updated &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/third-party/cisco-ios-xe/&quot;&gt;Cisco IOS XE&lt;/a&gt; guide.&lt;/p&gt;</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><product>Cloudflare WAN</product><category>Cloudflare WAN</category><category>Cloudflare One</category></item><item><title>Logs - New Turnstile Events Logpush dataset in Cloudflare Logs</title><link>https://developers.cloudflare.com/changelog/post/2026-06-01-log-fields-updated/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-01-log-fields-updated/</guid><description>&lt;p&gt;Cloudflare has updated &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/&quot;&gt;Logpush datasets&lt;/a&gt;:&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-datasets&quot;&gt;New datasets&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-datasets&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Turnstile Events&lt;/strong&gt;: A new dataset with fields including &lt;code&gt;ASN&lt;/code&gt;, &lt;code&gt;Action&lt;/code&gt;, &lt;code&gt;BrowserMajor&lt;/code&gt;, &lt;code&gt;BrowserName&lt;/code&gt;, &lt;code&gt;ClientIP&lt;/code&gt;, &lt;code&gt;CountryCode&lt;/code&gt;, &lt;code&gt;EventType&lt;/code&gt;, &lt;code&gt;Hostname&lt;/code&gt;, &lt;code&gt;OSMajor&lt;/code&gt;, &lt;code&gt;OSName&lt;/code&gt;, &lt;code&gt;Sitekey&lt;/code&gt;, &lt;code&gt;Timestamp&lt;/code&gt;, and &lt;code&gt;UserAgent&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the complete field definitions for each dataset, refer to &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/&quot;&gt;Logpush datasets&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>Cloudflare One Client - Cloudflare One Client for macOS (version 2026.5.1155.1)</title><link>https://developers.cloudflare.com/changelog/post/2026-05-29-warp-macos-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-29-warp-macos-beta/</guid><description>&lt;p&gt;A new Beta release for the macOS Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/&quot;&gt;beta releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right click context menu to access the most common client actions quickly&lt;/li&gt;
&lt;li&gt;Built-in captive portal login experience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Additional Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The client now applies DNS search suffixes configured in your &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles&quot;&gt;device profile&lt;/a&gt; / &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies&quot;&gt;network policy&lt;/a&gt;. Administrators can push a list of DNS search domains that the client appends to single-label queries, alongside any system-configured suffixes. See &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#dns-search-suffixes&quot;&gt;DNS search suffixes&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#vnet-availability&quot;&gt;VNET availability&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Added new warp-cli debug commands for interactive connection diagnosis. See &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/troubleshooting/diagnostic-logs/#extra-debug-logging&quot;&gt;Extra debug logging&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/parameters/#organization_configs&quot;&gt;Cloudflare One MDM documentation&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;Client Certificate device-posture checks now support template variables (e.g. &lt;code&gt;${serial_number}&lt;/code&gt;, &lt;code&gt;${device_uuid}&lt;/code&gt;) 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.&lt;/li&gt;
&lt;li&gt;Fixed the in-client captive-portal browser rendering a blank &amp;quot;Success&amp;quot; page on some airline Wi-Fi networks (United inflight Wi-Fi was the reported case). The browser now reliably loads the airline&amp;#39;s real portal page so users can complete sign-in from inside the client instead of having to open a separate browser.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Registration may hang at &amp;quot;Checking your organization configuration&amp;quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.&lt;/li&gt;
&lt;li&gt;Split tunnel list configuration is not available in the new UI. Management of split tunnel entries is currently only possible via &lt;code&gt;warp-cli tunnel ip&lt;/code&gt; and &lt;code&gt;warp-cli tunnel host&lt;/code&gt;. UI support will be added in a future release.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Fri, 29 May 2026 00:55:38 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - Cloudflare One Client for Windows (version 2026.5.1155.1)</title><link>https://developers.cloudflare.com/changelog/post/2026-05-29-warp-windows-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-29-warp-windows-beta/</guid><description>&lt;p&gt;A new Beta release for the Windows Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/&quot;&gt;beta releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right click context menu to access the most common client actions quickly&lt;/li&gt;
&lt;li&gt;Built-in captive portal login experience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Additional Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The client now applies DNS search suffixes configured in your &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles&quot;&gt;device profile&lt;/a&gt; / &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies&quot;&gt;network policy&lt;/a&gt;. Administrators can push a list of DNS search domains that the client appends to single-label queries, alongside any system-configured suffixes. See &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#dns-search-suffixes&quot;&gt;DNS search suffixes&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#vnet-availability&quot;&gt;VNET availability&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://blog.cloudflare.com/mandatory-authentication-mfa/&quot;&gt;announcement blog&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/windows-no-auth-no-internet/&quot;&gt;documentation&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Added new warp-cli debug commands for interactive connection diagnosis. See &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/troubleshooting/diagnostic-logs/#extra-debug-logging&quot;&gt;Extra debug logging&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/parameters/#organization_configs&quot;&gt;Cloudflare One MDM documentation&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;Client Certificate device-posture checks now support template variables (e.g. &lt;code&gt;${serial_number}&lt;/code&gt;, &lt;code&gt;${device_uuid}&lt;/code&gt;) 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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An error indicating that Microsoft Edge can&amp;#39;t read and write to its data directory may be displayed during captive portal login; this error is benign and can be dismissed.&lt;/li&gt;
&lt;li&gt;Registration may hang at &amp;quot;Checking your organization configuration&amp;quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.&lt;/li&gt;
&lt;li&gt;Split tunnel list configuration is not available in the new UI. Management of Split Tunnel entries is currently only possible via &lt;code&gt;warp-cli tunnel ip&lt;/code&gt; and &lt;code&gt;warp-cli tunnel host&lt;/code&gt;. UI support will be added in a future release.&lt;/li&gt;
&lt;li&gt;Windows ARM may prompt the user to close running applications while trying to install this version. Simply click “Ok” with the default highlighted option.&lt;/li&gt;
&lt;li&gt;DNS resolution may be broken when the following conditions are all true:&lt;ul&gt;
&lt;li&gt;The client is in Secure Web Gateway without DNS filtering (tunnel-only) mode.&lt;/li&gt;
&lt;li&gt;A custom DNS server address is configured on the primary network adapter.&lt;/li&gt;
&lt;li&gt;The custom DNS server address on the primary network adapter is changed while the client is connected.&lt;br&gt;To work around this issue, please reconnect the client by selecting &amp;quot;disconnect&amp;quot; and then &amp;quot;connect&amp;quot; in the client user interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Fri, 29 May 2026 00:55:37 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Agents - Share sandbox previews through Cloudflare Tunnel</title><link>https://developers.cloudflare.com/changelog/post/2026-05-29-sandbox-named-tunnels/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-29-sandbox-named-tunnels/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt; can expose a service running inside the container on a public preview URL through the &lt;code&gt;sandbox.tunnels&lt;/code&gt; namespace. The SDK uses &lt;code&gt;cloudflared&lt;/code&gt; inside the sandbox so you can share a running service without configuring &lt;code&gt;exposePort()&lt;/code&gt; or a custom domain.&lt;/p&gt;
&lt;p&gt;By default, &lt;code&gt;sandbox.tunnels.get(port)&lt;/code&gt; creates a &lt;a href=&quot;https://try.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;quick tunnel&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; on a zero-config &lt;code&gt;*.trycloudflare.com&lt;/code&gt; URL — no Cloudflare account, DNS record, or custom domain required. This is perfect for quick development and for &lt;code&gt;.workers.dev&lt;/code&gt; deployments.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { getSandbox } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; sandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getSandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env.Sandbox, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;startProcess&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;python -m http.server 8080&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tunnel&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.tunnels.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;8080&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(tunnel.url); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// → https://random-words-here.trycloudflare.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { getSandbox } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; sandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getSandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env.Sandbox, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;startProcess&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;python -m http.server 8080&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tunnel&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.tunnels.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;8080&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(tunnel.url); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// → https://random-words-here.trycloudflare.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;named-tunnels&quot;&gt;Named tunnels&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#named-tunnels&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;For more control you can create a named tunnel through &lt;code&gt;sandbox.tunnels.get(port, { name })&lt;/code&gt;. A named tunnel binds a hostname (&lt;code&gt;&amp;lt;name&amp;gt;.&amp;lt;your-zone&amp;gt;&lt;/code&gt;) backed by a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; and a CNAME record on your zone resulting in something like &lt;a href=&quot;https://my-app-preview.example.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://my-app-preview.example.com&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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&apos;s origin.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tunnel&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.tunnels.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;8080&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-app-preview&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(tunnel.url); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// → https://my-app-preview.example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tunnel&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.tunnels.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;8080&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-app-preview&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(tunnel.url); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// → https://my-app-preview.example.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Calling &lt;code&gt;sandbox.destroy()&lt;/code&gt; tears down the Cloudflare Tunnel and the associated DNS record alongside the container, so you do not leave dangling tunnels or records behind.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-1721e210-18dd-47d5-b87d-45112d770673-npm&quot; id=&quot;pm-tab-pm-1721e210-18dd-47d5-b87d-45112d770673-npm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-1721e210-18dd-47d5-b87d-45112d770673-yarn&quot; id=&quot;pm-tab-pm-1721e210-18dd-47d5-b87d-45112d770673-yarn&quot; data-nb-pm-tab class=&quot;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&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-1721e210-18dd-47d5-b87d-45112d770673-pnpm&quot; id=&quot;pm-tab-pm-1721e210-18dd-47d5-b87d-45112d770673-pnpm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-1721e210-18dd-47d5-b87d-45112d770673-bun&quot; id=&quot;pm-tab-pm-1721e210-18dd-47d5-b87d-45112d770673-bun&quot; data-nb-pm-tab class=&quot;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&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-1721e210-18dd-47d5-b87d-45112d770673-npm&quot; aria-labelledby=&quot;pm-tab-pm-1721e210-18dd-47d5-b87d-45112d770673-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i @cloudflare/sandbox@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i @cloudflare/sandbox@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-1721e210-18dd-47d5-b87d-45112d770673-yarn&quot; aria-labelledby=&quot;pm-tab-pm-1721e210-18dd-47d5-b87d-45112d770673-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add @cloudflare/sandbox@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add @cloudflare/sandbox@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-1721e210-18dd-47d5-b87d-45112d770673-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-1721e210-18dd-47d5-b87d-45112d770673-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add @cloudflare/sandbox@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add @cloudflare/sandbox@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-1721e210-18dd-47d5-b87d-45112d770673-bun&quot; aria-labelledby=&quot;pm-tab-pm-1721e210-18dd-47d5-b87d-45112d770673-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add @cloudflare/sandbox@latest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add @cloudflare/sandbox@latest&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;For full API details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/api/tunnels/&quot;&gt;Sandbox tunnels reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category></item><item><title>D1 - D1 migrations support nested layouts via `migrations_pattern`</title><link>https://developers.cloudflare.com/changelog/post/2026-06-04-migrations-pattern/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-06-04-migrations-pattern/</guid><description>&lt;p&gt;You can now point &lt;code&gt;wrangler d1 migrations apply&lt;/code&gt; at a nested migrations layout — such as the one produced by &lt;a href=&quot;https://orm.drizzle.team/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Drizzle&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; (&lt;code&gt;migrations/0001_init/migration.sql&lt;/code&gt;) — using the new &lt;code&gt;migrations_pattern&lt;/code&gt; D1 binding config:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;d1_databases&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;DB&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;database_name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-database&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;database_id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;lt;UUID&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;migrations_dir&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;migrations&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;migrations_pattern&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;migrations/*/migration.sql&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;code&gt;migrations_pattern&lt;/code&gt; is a glob (relative to your Wrangler config file) used to discover migration files. It defaults to &lt;code&gt;${migrations_dir}/*.sql&lt;/code&gt;, so existing projects keep working unchanged. Each migration&apos;s name is recorded in the migrations table as a path relative to &lt;code&gt;migrations_dir&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To learn more, visit D1&apos;s &lt;a href=&quot;https://developers.cloudflare.com/d1/reference/migrations/#nested-migration-layouts&quot;&gt;migrations documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><product>D1</product><category>D1</category></item><item><title>Logs - Updated fields across multiple Logpush datasets in Cloudflare Logs</title><link>https://developers.cloudflare.com/changelog/post/2026-05-29-log-fields-updated/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-29-log-fields-updated/</guid><description>&lt;p&gt;Cloudflare has updated &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/&quot;&gt;Logpush datasets&lt;/a&gt;:&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;updated-fields-in-existing-datasets&quot;&gt;Updated fields in existing datasets&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#updated-fields-in-existing-datasets&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DEX Device State Events&lt;/strong&gt; (added): &lt;code&gt;DeviceRegistrationProfileID&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gateway HTTP&lt;/strong&gt; (added): &lt;code&gt;AddedHeaders&lt;/code&gt;, &lt;code&gt;DeletedHeaders&lt;/code&gt;, and &lt;code&gt;SetHeaders&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP requests&lt;/strong&gt; (added): &lt;code&gt;MatchedRules&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the complete field definitions for each dataset, refer to &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/&quot;&gt;Logpush datasets&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>Radar - TLS bug detection in the Cloudflare Radar post-quantum checker</title><link>https://developers.cloudflare.com/changelog/post/2026-05-29-radar-pq-tls-bug-detection/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-29-radar-pq-tls-bug-detection/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; &lt;a href=&quot;https://radar.cloudflare.com/post-quantum#website-support&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;post-quantum TLS support checker&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;The following TLS bugs are detected:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Split ClientHello&lt;/strong&gt; — The connection fails with a fragmented post-quantum &lt;code&gt;ClientHello&lt;/code&gt; but succeeds with classical handshakes. Typically caused by middleboxes or firewalls that cannot reassemble split TLS messages.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HRR Failure&lt;/strong&gt; — The server sends a &lt;code&gt;HelloRetryRequest&lt;/code&gt; but fails to complete the handshake afterward.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unknown Keyshare&lt;/strong&gt; — The server cannot handle unknown key exchange algorithms and fails instead of responding with a &lt;code&gt;HelloRetryRequest&lt;/code&gt; as required by the TLS 1.3 specification.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2260,height=1244,format=webp/_astro/pq-tls-bug-detection.BrmsVMno.png&quot; alt=&quot;TLS bug detection results in the Radar post-quantum checker&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2260&quot; height=&quot;1244&quot;&gt;
&lt;p&gt;Bug detection data is available through the existing &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/post_quantum/subresources/tls/methods/support/&quot;&gt;&lt;code&gt;/post_quantum/tls/support&lt;/code&gt;&lt;/a&gt; endpoint.&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://radar.cloudflare.com/post-quantum#website-support&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Post-Quantum Encryption&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; page to test a host.&lt;/p&gt;</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Realtime - Cloudflare&apos;s Realtime WebSocket adapter now auto-reconnects and buffers WebRTC media</title><link>https://developers.cloudflare.com/changelog/post/2026-05-29-websocket-adapter-auto-reconnect/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-29-websocket-adapter-auto-reconnect/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/&quot;&gt;Cloudflare Realtime SFU&lt;/a&gt; is a &lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/calls-vs-sfus/&quot;&gt;WebRTC Selective Forwarding Unit that runs on Cloudflare&apos;s global network&lt;/a&gt;, so you can route live audio, video, and data between WebRTC clients around the world without managing SFU infrastructure or regions.&lt;/p&gt;
&lt;p&gt;When you use the &lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/&quot;&gt;WebSocket adapter&lt;/a&gt; to stream WebRTC media to a WebSocket endpoint, the adapter now auto-reconnects and buffers audio and video after brief endpoint disconnects or restarts.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;streaming-webrtc-media-to-websocket-endpoints&quot;&gt;Streaming WebRTC media to WebSocket endpoints&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#streaming-webrtc-media-to-websocket-endpoints&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Workers&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt;, or external services, without running a WebRTC client themselves.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/&quot;&gt;WebSocket adapter&lt;/a&gt; bridges that gap by streaming WebRTC media from the SFU to a standard WebSocket endpoint as application-consumable payloads: &lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/#media-formats&quot;&gt;PCM audio frames and JPEG video frames&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-changed&quot;&gt;What changed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When you use the WebSocket adapter in &lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/#stream-mode-egress&quot;&gt;Stream mode (egress)&lt;/a&gt; to send live audio or video from the SFU to your own WebSocket endpoint, the SFU now &lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/#automatic-reconnection-for-streaming&quot;&gt;automatically reconnects&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The reconnect behavior also includes &lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/#media-buffering-during-reconnect&quot;&gt;live-first media buffering&lt;/a&gt;, so brief interruptions reduce media loss without replaying stale video.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;reconnect-behavior&quot;&gt;Reconnect behavior&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#reconnect-behavior&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;During reconnect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Video resumes from the &lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/#video-jpeg&quot;&gt;latest available JPEG frame&lt;/a&gt; instead of replaying stale frames.&lt;/li&gt;
&lt;li&gt;Recovery is best effort and does not guarantee gapless or exactly-once delivery.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If the endpoint remains unavailable after the 5-second reconnect window, the adapter closes and must be recreated.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;learn-more&quot;&gt;Learn more&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#learn-more&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/&quot;&gt;WebSocket adapter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/media-transport-adapters/websocket-adapter/#automatic-reconnection-for-streaming&quot;&gt;Automatic reconnection for streaming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/get-started/&quot;&gt;Get started with Realtime SFU&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/example-architecture/&quot;&gt;Realtime SFU example architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/sfu/calls-vs-sfus/&quot;&gt;Realtime vs Regular SFUs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://realtime-sfu.dev-demos.workers.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Global SFU Network Visualization&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><product>Realtime</product><category>Realtime</category></item><item><title>Security Center - Security scans more frequent</title><link>https://developers.cloudflare.com/changelog/post/2026-05-29-security-insights-default-scans/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-29-security-insights-default-scans/</guid><description>&lt;p&gt;Security Insights scans now run more often. Cloudflare scans Free accounts &lt;strong&gt;every 7 days&lt;/strong&gt;, Pro and Business accounts &lt;strong&gt;every 3 days&lt;/strong&gt;, and Enterprise accounts &lt;strong&gt;daily&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To learn more, refer to the &lt;a href=&quot;https://developers.cloudflare.com/security/security-insights/&quot;&gt;Security Insights documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Access - Tool and prompt aliases for MCP server portals</title><link>https://developers.cloudflare.com/changelog/post/2026-05-28-mcp-portal-tool-prompt-aliases/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-28-mcp-portal-tool-prompt-aliases/</guid><description>&lt;p&gt;When you connect third-party MCP servers through &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/&quot;&gt;MCP server portals&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;You can now &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#rename-tools-and-prompts-with-aliases&quot;&gt;rename tools and prompts&lt;/a&gt; and rewrite their descriptions directly on the portal, without modifying the upstream server. For example, a tool named &lt;code&gt;super_cool_tool&lt;/code&gt; can become &lt;code&gt;search_customer_records&lt;/code&gt; with a description tailored to your organization.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1640,height=1144,format=webp/_astro/portal-edit-tool-modal.DrxORhBl.png&quot; alt=&quot;Edit tool modal showing name and description fields for an MCP server tool&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1640&quot; height=&quot;1144&quot;&gt;
&lt;p&gt;Modified tools display a &lt;strong&gt;Modified&lt;/strong&gt; label in the tools list so administrators can see which tools have been customized at a glance.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1862,height=700,format=webp/_astro/portal-tools-authorized-modified.B674Xvip.png&quot; alt=&quot;Tools authorized list showing a modified label on a renamed tool&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1862&quot; height=&quot;700&quot;&gt;
&lt;p&gt;Aliases override the metadata that MCP clients receive. You can set them at two levels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Per portal&lt;/strong&gt;: Applies only within a specific portal. Takes precedence over server-level aliases.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per server&lt;/strong&gt;: Applies across all portals that use the server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can reset an alias at any time to restore the original upstream name.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#rename-tools-and-prompts-with-aliases&quot;&gt;Tool and prompt aliases&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Browser Run - Use Browser Run Quick Actions directly from Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-05-28-use-browser-run-quick-actions-directly-from-workers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-28-use-browser-run-quick-actions-directly-from-workers/</guid><description>
&lt;p&gt;You can now call &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/&quot;&gt;Browser Run Quick Actions&lt;/a&gt; directly from a &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Cloudflare Worker&lt;/a&gt; using the &lt;code&gt;quickAction()&lt;/code&gt; 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&apos;s network, resulting in simpler code and lower latency.&lt;/p&gt;
&lt;p&gt;With the &lt;code&gt;quickAction()&lt;/code&gt; method you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/screenshot-endpoint/&quot;&gt;Capture screenshots&lt;/a&gt; from URLs or HTML&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/pdf-endpoint/&quot;&gt;Generate PDFs&lt;/a&gt; with custom styling, headers, and footers&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/content-endpoint/&quot;&gt;Extract HTML content&lt;/a&gt; from fully rendered pages&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/markdown-endpoint/&quot;&gt;Convert pages to Markdown&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/json-endpoint/&quot;&gt;Extract structured JSON&lt;/a&gt; using AI&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/scrape-endpoint/&quot;&gt;Scrape elements&lt;/a&gt; with CSS selectors&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/links-endpoint/&quot;&gt;Get all links&lt;/a&gt; from a page&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/snapshot/&quot;&gt;Capture snapshots&lt;/a&gt; (HTML + screenshot in one request)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, add a browser binding to your Wrangler configuration:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;compatibility_date&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-03-24&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;browser&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;BROWSER&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;compatibility_date = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-03-24&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;BROWSER&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;Then call any Quick Action directly from your Worker. For example, to capture a screenshot:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; screenshot&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;BROWSER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;quickAction&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;screenshot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	url: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://www.cloudflare.com/&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; screenshot&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;BROWSER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;quickAction&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;screenshot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  url: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://www.cloudflare.com/&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;quickAction()&lt;/code&gt; method requires a compatibility date of &lt;code&gt;2026-03-24&lt;/code&gt; or later.&lt;/p&gt;
&lt;p&gt;For setup instructions and the full list of available actions, refer to &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/&quot;&gt;Browser Run Quick Actions&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>Cloudflare Mesh, Cloudflare One - High availability replica management for Cloudflare Mesh</title><link>https://developers.cloudflare.com/changelog/post/2026-05-28-mesh-ha-replica-ui/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-28-mesh-ha-replica-ui/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;Cloudflare Mesh&lt;/a&gt; dashboard now shows per-replica details for &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/high-availability/&quot;&gt;high availability&lt;/a&gt; nodes. You can see which replica is active, view each replica&apos;s Mesh IP and connection details, and manually trigger failover — all from the node detail page.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=1155,format=webp/_astro/mesh-ha-replicas.Dvf1GMmQ.gif&quot; alt=&quot;Mesh HA replica tabs showing active and passive replicas with per-replica Mesh IPs and a manual failover option&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1800&quot; height=&quot;1155&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Replica tabs&lt;/strong&gt; on the node detail page — switch between replicas to see each one&apos;s Mesh IP, edge data center, origin IP, platform, version, and uptime.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Active/passive badges&lt;/strong&gt; identify which replica is currently routing traffic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manual failover&lt;/strong&gt; — promote a passive replica to active with a single click. The previous active replica switches to standby.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HA badge&lt;/strong&gt; in the overview table identifies nodes running multiple replicas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Active replica IP&lt;/strong&gt; shown in the overview table — the dashboard now resolves which replica is active and displays the correct Mesh IP.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;manual-failover&quot;&gt;Manual failover&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#manual-failover&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To manually promote a passive replica:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/mesh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, go to &lt;strong&gt;Networking&lt;/strong&gt; &amp;gt; &lt;strong&gt;Mesh&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select an HA-enabled node.&lt;/li&gt;
&lt;li&gt;Select the passive replica tab.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Promote to active&lt;/strong&gt; and confirm.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Traffic reroutes to the promoted replica immediately. Refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/high-availability/&quot;&gt;High availability&lt;/a&gt; for details on failover behavior.&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>Cloudflare Mesh</product><category>Cloudflare Mesh</category><category>Cloudflare One</category></item><item><title>Containers - Wrangler supports SSH ProxyCommand for Containers</title><link>https://developers.cloudflare.com/changelog/post/2026-05-28-ssh-proxy-command/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-28-ssh-proxy-command/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt; supports using &lt;code&gt;wrangler containers ssh&lt;/code&gt; as an OpenSSH &lt;code&gt;ProxyCommand&lt;/code&gt; for &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt;. This lets your local SSH client connect to a running Container through Wrangler.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -o&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ProxyCommand=&quot;wrangler containers ssh %h&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; cloudchamber@&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;INSTANCE_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;When standard input and output are piped, Wrangler forwards data to the SSH server in the Container. You can also pass &lt;code&gt;--stdio&lt;/code&gt; to force this mode.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/containers/ssh/&quot;&gt;SSH documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Email Service - Send emails with named recipient addresses</title><link>https://developers.cloudflare.com/changelog/post/2026-05-28-named-email-recipients/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-28-named-email-recipients/</guid><description>
&lt;p&gt;You can now send emails with display names on recipient addresses in addition to the existing &lt;code&gt;from&lt;/code&gt; support. Pass an object with &lt;code&gt;email&lt;/code&gt; and an optional &lt;code&gt;name&lt;/code&gt; field for &lt;code&gt;to&lt;/code&gt;, &lt;code&gt;cc&lt;/code&gt;, &lt;code&gt;bcc&lt;/code&gt;, &lt;code&gt;replyTo&lt;/code&gt;, or &lt;code&gt;from&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;EMAIL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			from: { email: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;support@example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Support Team&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			to: { email: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;jane@example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Jane Doe&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			cc: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				&quot;manager@company.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				{ email: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;team@company.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Engineering Team&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			subject: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Welcome!&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			html: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;h1&gt;Thanks for joining!&amp;#x3C;/h1&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			text: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Thanks for joining!&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ messageId: response.messageId });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;EMAIL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			from: { email: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;support@example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Support Team&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			to: { email: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;jane@example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Jane Doe&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			cc: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				&quot;manager@company.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				{ email: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;team@company.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Engineering Team&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			subject: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Welcome!&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			html: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;h1&gt;Thanks for joining!&amp;#x3C;/h1&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			text: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Thanks for joining!&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ messageId: response.messageId });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExportedHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;Plain strings remain fully supported for backward compatibility, and you can mix strings and named objects in the same array.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/email-service/api/send-emails/workers-api/&quot;&gt;Workers API&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/email-service/api/send-emails/rest-api/&quot;&gt;REST API&lt;/a&gt; documentation for full request examples.&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>Email Service</product><category>Email Service</category></item><item><title>Pipelines - Pipelines pricing announced</title><link>https://developers.cloudflare.com/changelog/post/2026-05-11-pipelines-pricing-announced/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-11-pipelines-pricing-announced/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/pipelines/&quot;&gt;Cloudflare Pipelines&lt;/a&gt; is a streaming data platform that ingests events, transforms them with SQL, and writes to &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt; as JSON, Parquet, or &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Billing is not yet enabled. We will provide at least 30 days notice before we start charging for Pipelines usage.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pipelines pricing model is designed to charge per GB based on what you use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Streams (ingress)&lt;/strong&gt;: Free, regardless of volume.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SQL transforms&lt;/strong&gt;: $0.04 / GB for stateless transforms (filter, reshape, unnest, cast, compute).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sinks&lt;/strong&gt;: $0.03 / GB for JSON, $0.06 / GB for Parquet or Iceberg output.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Workers Free plans include 1 GB / month for each dimension. Workers Paid plans include 50 GB / month.&lt;/p&gt;
&lt;p&gt;For full pricing details and billing examples, refer to &lt;a href=&quot;https://developers.cloudflare.com/pipelines/platform/pricing/&quot;&gt;Pipelines pricing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>Pipelines</product><category>Pipelines</category></item><item><title>R2, R2 Data Catalog - R2 Data Catalog pricing announced</title><link>https://developers.cloudflare.com/changelog/post/2026-05-11-r2-data-catalog-pricing-announced/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-11-r2-data-catalog-pricing-announced/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; is a managed &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/r2/pricing/&quot;&gt;R2 storage and operations&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Billing is not yet enabled. We will provide at least 30 days notice before we start charging for R2 Data Catalog usage.&lt;/p&gt;
&lt;p&gt;Pricing is based on two dimensions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Catalog operations&lt;/strong&gt;: $9.00 / million operations for metadata requests such as creating tables, reading table metadata, and updating table properties.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compaction&lt;/strong&gt;: $0.005 / GB processed and $2.00 / million objects processed. These charges only apply when automatic compaction is turned on for a table.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both dimensions include a monthly free tier: 1 million catalog operations, 10 GB of compaction data processed, and 1 million compaction objects processed.&lt;/p&gt;
&lt;p&gt;For full pricing details and billing examples, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/platform/pricing/&quot;&gt;R2 Data Catalog pricing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category><category>R2 Data Catalog</category></item><item><title>R2, R2 Data Catalog - R2 Data Catalog gets a dedicated dashboard experience</title><link>https://developers.cloudflare.com/changelog/post/2026-05-28-r2-data-catalog-dashboard/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-28-r2-data-catalog-dashboard/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; is a managed &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; data catalog built directly into your R2 bucket. It exposes a standard Iceberg REST catalog interface so you can connect query engines like &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/config-examples/spark-scala/&quot;&gt;Spark&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/config-examples/snowflake/&quot;&gt;Snowflake&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/config-examples/duckdb/&quot;&gt;DuckDB&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; to your data in R2.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3070,height=1486,format=webp/_astro/data-catalog-dashboard.BsKDvUQn.png&quot; alt=&quot;R2 Data Catalog dashboard overview&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3070&quot; height=&quot;1486&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Catalog overview&lt;/strong&gt; — View all your catalogs in one place with catalog request counts, bucket sizes, and table maintenance status at a glance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Guided setup wizard&lt;/strong&gt; — 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Settings management&lt;/strong&gt; — 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 &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/table-maintenance/&quot;&gt;snapshot expiration&lt;/a&gt; directly from the dashboard.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built-in metrics&lt;/strong&gt; — Five charts on each catalog&apos;s metrics tab: bytes compacted, files compacted, catalog requests, storage size, and snapshots expired.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, go to &lt;strong&gt;R2 Data Catalog&lt;/strong&gt; in the Cloudflare dashboard or refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/get-started/&quot;&gt;getting started guide&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/manage-catalogs/&quot;&gt;manage catalogs documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category><category>R2 Data Catalog</category></item><item><title>R2 SQL - R2 SQL pricing announced</title><link>https://developers.cloudflare.com/changelog/post/2026-05-11-r2-sql-pricing-announced/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-11-r2-sql-pricing-announced/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; is a serverless, distributed query engine that runs SQL against &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables stored in &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;Billing is not yet enabled. We will provide at least 30 days notice before we start charging for R2 SQL usage.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;All plans include 10 GB of data scanned per month. Standard &lt;a href=&quot;https://developers.cloudflare.com/r2/pricing/&quot;&gt;R2 storage and operations&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/platform/pricing/&quot;&gt;R2 Data Catalog&lt;/a&gt; charges apply separately.&lt;/p&gt;
&lt;p&gt;For full pricing details and billing examples, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/platform/pricing/&quot;&gt;R2 SQL pricing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Realtime - Record specific participant audio tracks in RealtimeKit</title><link>https://developers.cloudflare.com/changelog/post/2026-05-28-realtimekit-track-recording/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-28-realtimekit-track-recording/</guid><description>&lt;p&gt;You can now record specific participant audio tracks in RealtimeKit with &lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/recording-guide/track-recording/&quot;&gt;track recording&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;To record specific participants, pass &lt;code&gt;user_ids&lt;/code&gt; when starting a track recording:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --url&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;account_i&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/realtime/kit/&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;app_i&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/recordings/track&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer &amp;lt;api_token&amp;gt;&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  &quot;meeting_id&quot;: &quot;97440c6a-140b-40a9-9499-b23fd7a3868a&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  &quot;user_ids&quot;: [&quot;user-123&quot;, &quot;user-456&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To pass &lt;code&gt;user_ids&lt;/code&gt; for selective track recording, use the following minimum SDK versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web Core: &lt;code&gt;@cloudflare/realtimekit&lt;/code&gt; version &lt;code&gt;1.4.0&lt;/code&gt; or later&lt;/li&gt;
&lt;li&gt;Web UI Kit: &lt;code&gt;@cloudflare/realtimekit-ui&lt;/code&gt;, &lt;code&gt;@cloudflare/realtimekit-react-ui&lt;/code&gt;, or &lt;code&gt;@cloudflare/realtimekit-angular-ui&lt;/code&gt; version &lt;code&gt;1.1.2&lt;/code&gt; or later&lt;/li&gt;
&lt;li&gt;Android Core or iOS Core: version &lt;code&gt;2.0.0&lt;/code&gt; or later&lt;/li&gt;
&lt;li&gt;Android UI Kit or iOS UI Kit: version &lt;code&gt;1.1.0&lt;/code&gt; or later&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/&quot;&gt;RealtimeKit&lt;/a&gt; provides SDKs and UI components so that you can build your own meeting experience on Cloudflare&apos;s &lt;a href=&quot;https://developers.cloudflare.com/realtime/#realtime-sfu&quot;&gt;global WebRTC infrastructure&lt;/a&gt;. Teams today build products ranging from telehealth to education on RealtimeKit for global audiences. You can get started today with our &lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/quickstart/&quot;&gt;Quickstart&lt;/a&gt; or take a look at our &lt;a href=&quot;https://github.com/cloudflare/meet&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Meet repo&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; as a reference.&lt;/p&gt;</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><product>Realtime</product><category>Realtime</category></item><item><title>Cloudflare One, Gateway - Write regex using natural language in Cloudflare One</title><link>https://developers.cloudflare.com/changelog/post/2026-05-27-cloudy-regex-assistance/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-27-cloudy-regex-assistance/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot;&gt;Cloudflare Gateway&lt;/a&gt; policy selectors which support regular expressions can now be authored in the dashboard using natural language. When building a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/expression-syntax/&quot;&gt;policy&lt;/a&gt; with a regex-based selector (like &lt;code&gt;matches regex&lt;/code&gt;), you can describe what you want to match in plain English and the Cloudflare Agent will generate and validate a corresponding regular expression.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1000,height=638,format=webp/_astro/gateway-regex-ai-generation.CtJ0S6FS.png&quot; alt=&quot;Write policy regex using natural language&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1000&quot; height=&quot;638&quot;&gt;
&lt;p&gt;To get started, select a regex-compatible selector in the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot;&gt;Gateway policy builder&lt;/a&gt; and select the icon. You&apos;ll see an input field for natural language, such as &quot;any URL starting with /api/v1&quot; or &quot;.com, .net, and .app hosts which contain &lt;code&gt;gooogle&lt;/code&gt; in the host.&quot;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;A built-in feedback mechanism allows you to rate each interaction to help improve output quality over time.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot;&gt;Cloudflare One firewall policies&lt;/a&gt; and expect to see the same functionality supported soon in &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/&quot;&gt;Data loss prevention profiles&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category><category>Gateway</category></item><item><title>Cloudflare Images - Transformation flows in Images</title><link>https://developers.cloudflare.com/changelog/post/2026-05-27-transformation-flows/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-27-transformation-flows/</guid><description>&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1654,height=1398,format=webp/_astro/custom-flow.DeAGR8BY.png&quot; alt=&quot;Custom flow configuration panel&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1654&quot; height=&quot;1398&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;There are two modes for transformation flows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/images/optimization/transformations/flows/#set-up-a-provider-flow&quot;&gt;Provider flows&lt;/a&gt;&lt;/strong&gt; — 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/images/optimization/transformations/flows/#set-up-a-custom-flow&quot;&gt;Custom flows&lt;/a&gt;&lt;/strong&gt; — Define your own conditions and actions for use cases like automatic format conversion, &lt;a href=&quot;https://developers.cloudflare.com/images/optimization/make-responsive-images/#using-widthauto&quot;&gt;responsive sizing&lt;/a&gt; with &lt;code&gt;width=auto&lt;/code&gt;, or directory-based optimization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, go to &lt;strong&gt;Images&lt;/strong&gt; &amp;gt; &lt;strong&gt;Transformations&lt;/strong&gt; &amp;gt; &lt;strong&gt;Automation&lt;/strong&gt; in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/images/transformations&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/images/optimization/transformations/flows/&quot;&gt;transformation flows&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><product>Cloudflare Images</product><category>Cloudflare Images</category></item><item><title>Cloudflare Tunnel, Cloudflare Tunnel for SASE - Cloudflare Tunnel now runs connectivity pre-checks at startup</title><link>https://developers.cloudflare.com/changelog/post/2026-05-27-cloudflared-connectivity-prechecks/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-27-cloudflared-connectivity-prechecks/</guid><description>&lt;p&gt;Starting with &lt;a href=&quot;https://github.com/cloudflare/cloudflared/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflared&lt;/code&gt; version 2026.5.2&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; automates the entire &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/troubleshoot-tunnels/connectivity-prechecks/&quot;&gt;connectivity pre-checks workflow&lt;/a&gt; directly inside the binary. Previously, customers had to install &lt;code&gt;dig&lt;/code&gt; and &lt;code&gt;netcat&lt;/code&gt; and run those commands by hand to verify their environment. Now &lt;code&gt;cloudflared&lt;/code&gt; does it natively at startup — and surfaces actionable remediation when something is blocked.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=1012,format=webp/_astro/cloudflared-connectivity-prechecks.DRwN6tGe.gif&quot; alt=&quot;cloudflared connectivity pre-checks output&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1800&quot; height=&quot;1012&quot;&gt;
&lt;p&gt;On every &lt;code&gt;cloudflared tunnel run&lt;/code&gt; (and &lt;code&gt;cloudflared tunnel diag&lt;/code&gt;), the binary now natively checks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DNS resolution&lt;/strong&gt; — &lt;code&gt;region1.v2.argotunnel.com&lt;/code&gt; and &lt;code&gt;region2.v2.argotunnel.com&lt;/code&gt; resolve to valid Cloudflare IPs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transport connectivity&lt;/strong&gt; — outbound &lt;code&gt;UDP (QUIC)&lt;/code&gt; and &lt;code&gt;TCP (HTTP/2)&lt;/code&gt; on port &lt;code&gt;7844&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Management API&lt;/strong&gt; — outbound &lt;code&gt;TCP/443&lt;/code&gt; to &lt;code&gt;api.cloudflare.com&lt;/code&gt; for software updates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Results are printed in a scannable CLI table with three states:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Pass&lt;/strong&gt; — the check succeeded.&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Warn&lt;/strong&gt; — a non-blocking issue, for example the Management API is unreachable so automatic updates will not work, but the tunnel will still come up.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;Fail&lt;/strong&gt; — a blocking issue, with a specific remediation hint (for example, &lt;code&gt;Allow outbound UDP on port 7844&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If DNS is unresolvable, or &lt;strong&gt;both&lt;/strong&gt; UDP and TCP fail on port 7844, &lt;code&gt;cloudflared&lt;/code&gt; exits early with the failure rather than looping on opaque &lt;code&gt;failed to dial&lt;/code&gt; errors.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To get the new behavior, upgrade &lt;code&gt;cloudflared&lt;/code&gt; to version &lt;code&gt;2026.5.2&lt;/code&gt; or later. For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/troubleshoot-tunnels/connectivity-prechecks/&quot;&gt;Connectivity pre-checks documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate><product>Cloudflare Tunnel</product><category>Cloudflare Tunnel</category><category>Cloudflare Tunnel for SASE</category></item><item><title>Cloudflare One Client - Cloudflare One Client for macOS (version 2026.4.1390.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-05-26-warp-macos-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-26-warp-macos-ga/</guid><description>&lt;p&gt;A new GA release for the macOS Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right click context menu to access the most common client actions quickly&lt;/li&gt;
&lt;li&gt;Built-in captive portal login experience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Additional Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added a new CLI command: warp-cli mdm refresh. This command executes an immediate refresh of the Mobile Device Management (MDM) configuration file.&lt;/li&gt;
&lt;li&gt;Fixed a proxy mode connection stall issue.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Registration may hang at &amp;quot;Checking your organization configuration&amp;quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.&lt;/li&gt;
&lt;li&gt;Split tunnel list configuration is not available in the new UI. Management of split tunnel entries is currently only possible via &lt;code&gt;warp-cli tunnel ip&lt;/code&gt; and &lt;code&gt;warp-cli tunnel host&lt;/code&gt;. UI support will be added in a future release.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 26 May 2026 22:26:01 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - Cloudflare One Client for Windows (version 2026.4.1390.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-05-26-warp-windows-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-26-warp-windows-ga/</guid><description>&lt;p&gt;A new GA release for the Windows Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right click context menu to access the most common client actions quickly&lt;/li&gt;
&lt;li&gt;Built-in captive portal login experience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Additional Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added a new CLI command: warp-cli mdm refresh. This command executes an immediate refresh of the Mobile Device Management (MDM) configuration file.&lt;/li&gt;
&lt;li&gt;Fixed a proxy mode connection stall issue.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;An error indicating that Microsoft Edge can&amp;#39;t read and write to its data directory may be displayed during captive portal login; this error is benign and can be dismissed.&lt;/li&gt;
&lt;li&gt;Registration may hang at &amp;quot;Checking your organization configuration&amp;quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.&lt;/li&gt;
&lt;li&gt;Split tunnel list configuration is not available in the new UI. Management of Split Tunnel entries is currently only possible via &lt;code&gt;warp-cli tunnel ip&lt;/code&gt; and &lt;code&gt;warp-cli tunnel host&lt;/code&gt;. UI support will be added in a future release.&lt;/li&gt;
&lt;li&gt;Windows ARM may prompt the user to close running applications while trying to install this version. Simply click “Ok” with the default highlighted option.&lt;/li&gt;
&lt;li&gt;DNS resolution may be broken when the following conditions are all true:&lt;ul&gt;
&lt;li&gt;The client is in Secure Web Gateway without DNS filtering (tunnel-only) mode.&lt;/li&gt;
&lt;li&gt;A custom DNS server address is configured on the primary network adapter.&lt;/li&gt;
&lt;li&gt;The custom DNS server address on the primary network adapter is changed while the client is connected.&lt;br&gt;To work around this issue, please reconnect the client by selecting &amp;quot;disconnect&amp;quot; and then &amp;quot;connect&amp;quot; in the client user interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 26 May 2026 22:26:00 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - Cloudflare One Client for Linux (version 2026.4.1390.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-05-26-warp-linux-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-26-warp-linux-ga/</guid><description>&lt;p&gt;A new GA release for the Linux Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right click context menu to access the most common client actions quickly&lt;/li&gt;
&lt;li&gt;Built-in captive portal login experience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added a new CLI command: warp-cli mdm refresh. This command executes an immediate refresh of the Mobile Device Management (MDM) configuration file.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Fixed a proxy mode connection stall issue.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Registration may hang at &amp;quot;Checking your organization configuration&amp;quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.&lt;/li&gt;
&lt;li&gt;Split tunnel list configuration is not available in the new UI. Management of split tunnel entries is currently only possible via &lt;code&gt;warp-cli tunnel ip&lt;/code&gt; and &lt;code&gt;warp-cli tunnel host&lt;/code&gt;. UI support will be added in a future release.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 26 May 2026 20:32:41 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cache - BYPASS status now returned for uncacheable responses</title><link>https://developers.cloudflare.com/changelog/post/2026-05-26-bypass-status-for-uncacheable-responses/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-26-bypass-status-for-uncacheable-responses/</guid><description>&lt;p&gt;Cloudflare now returns a &lt;code&gt;BYPASS&lt;/code&gt; &lt;a href=&quot;https://developers.cloudflare.com/cache/concepts/cache-responses/&quot;&gt;cache status&lt;/a&gt; whenever a response is not cacheable, instead of the previous mix of &lt;code&gt;BYPASS&lt;/code&gt; and &lt;code&gt;MISS&lt;/code&gt; that depended on why Cloudflare chose not to cache the response.&lt;/p&gt;
&lt;p&gt;There are multiple reasons Cloudflare may refuse to cache a response — for example, the response exceeds the &lt;a href=&quot;https://developers.cloudflare.com/cache/concepts/default-cache-behavior/#cacheable-size-limits&quot;&gt;maximum cacheable file size&lt;/a&gt; for your plan, the origin sends &lt;code&gt;Cache-Control: no-cache&lt;/code&gt;, &lt;code&gt;private&lt;/code&gt;, or &lt;code&gt;max-age=0&lt;/code&gt;, the response includes a &lt;code&gt;Set-Cookie&lt;/code&gt; header, or the request includes an &lt;code&gt;Authorization&lt;/code&gt; header.&lt;/p&gt;
&lt;p&gt;Previously, only some of these conditions returned &lt;code&gt;BYPASS&lt;/code&gt;. Others — such as responses exceeding the maximum cacheable file size — returned &lt;code&gt;MISS&lt;/code&gt; on every request, regardless of whether &lt;a href=&quot;https://developers.cloudflare.com/cache/concepts/cache-control/#origin-cache-control-behavior&quot;&gt;Origin Cache Control&lt;/a&gt; was on or off. Because the response could never be cached, every subsequent request also returned &lt;code&gt;MISS&lt;/code&gt;, 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.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;BYPASS&lt;/code&gt; now consistently signals that Cloudflare refused to cache the response, regardless of the reason. &lt;code&gt;MISS&lt;/code&gt; is reserved for cacheable responses that simply were not in the local cache at request time.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-to-expect-in-your-analytics&quot;&gt;What to expect in your analytics&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-to-expect-in-your-analytics&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;After this change rolls out, you should see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MISS rate decreases&lt;/strong&gt;: Uncacheable responses no longer count as cache misses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BYPASS rate increases&lt;/strong&gt;: These same responses are now reported as bypasses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cache hit ratio increases&lt;/strong&gt;: Hit ratio calculations no longer include uncacheable traffic that could never have been cached, giving you a more accurate view of cache effectiveness.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your total request volume and origin traffic are unchanged — only the cache status label is different.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;browser-cache-ttl-behavior-is-preserved&quot;&gt;Browser cache TTL behavior is preserved&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#browser-cache-ttl-behavior-is-preserved&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The cache status label is the only thing changing — browser cache TTL handling for any given response is identical to what it was before:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Responses that historically returned &lt;code&gt;MISS&lt;/code&gt; because Cloudflare refused to cache them (for example, responses over the maximum cacheable file size) now return &lt;code&gt;BYPASS&lt;/code&gt;, but continue to have browser cache TTL applied — exactly as they did when they were labeled &lt;code&gt;MISS&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Responses that historically returned &lt;code&gt;BYPASS&lt;/code&gt; and skipped browser cache TTL continue to skip browser cache TTL.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;code&gt;BYPASS&lt;/code&gt; label.&lt;/p&gt;</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><product>Cache</product><category>Cache</category></item><item><title>Flagship - Flagship now in public beta</title><link>https://developers.cloudflare.com/changelog/post/2026-05-26-public-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-26-public-beta/</guid><description>
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/flagship/&quot;&gt;Flagship&lt;/a&gt;&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;Evaluate a flag from a Worker in a few lines of code:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; showNewCheckout&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;FLAGS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getBooleanValue&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			&quot;new-checkout&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(showNewCheckout &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;New checkout&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Standard checkout&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; showNewCheckout&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;FLAGS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getBooleanValue&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;new-checkout&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			showNewCheckout &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;New checkout&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Standard checkout&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExportedHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;Start creating flags from the Cloudflare dashboard today. Refer to the &lt;a href=&quot;https://developers.cloudflare.com/flagship/get-started/&quot;&gt;Flagship documentation&lt;/a&gt; to get started.&lt;/p&gt;</description><pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate><product>Flagship</product><category>Flagship</category></item><item><title>AI Gateway - Call any AI model through AI Gateway&apos;s new REST API</title><link>https://developers.cloudflare.com/changelog/post/2026-05-21-rest-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-21-rest-api/</guid><description>&lt;p&gt;AI Gateway now uses the AI REST API on &lt;code&gt;api.cloudflare.com&lt;/code&gt;. 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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;POST /ai/run&lt;/code&gt; — universal endpoint for all models and modalities&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /ai/v1/chat/completions&lt;/code&gt; — OpenAI SDK compatible&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /ai/v1/responses&lt;/code&gt; — OpenAI Responses API compatible&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /ai/v1/messages&lt;/code&gt; — Anthropic SDK compatible&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/ai/v1/chat/completions&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;model&quot;: &quot;openai/gpt-5.5&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;messages&quot;: [{&quot;role&quot;: &quot;user&quot;, &quot;content&quot;: &quot;What is Cloudflare?&quot;}]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;All AI Gateway features — logging, caching, rate limiting, and guardrails — are applied automatically. Third-party models are billed through &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/features/unified-billing/&quot;&gt;Unified Billing&lt;/a&gt;, so you do not need to manage separate provider API keys.&lt;/p&gt;
&lt;p&gt;Third-party model requests are routed through your account&apos;s default gateway, which is created automatically on first use. To route requests through a specific gateway, add the &lt;code&gt;cf-aig-gateway-id&lt;/code&gt; header.&lt;/p&gt;
&lt;p&gt;If you are already calling Workers AI models through the existing REST API, that path (&lt;code&gt;/ai/run/@cf/{model}&lt;/code&gt;) continues to work. To call Workers AI models through AI Gateway, use the &lt;code&gt;@cf/&lt;/code&gt; model prefix (for example, &lt;code&gt;@cf/moonshotai/kimi-k2.6&lt;/code&gt;) and include the &lt;code&gt;cf-aig-gateway-id&lt;/code&gt; header to specify which gateway to route through.&lt;/p&gt;
&lt;p&gt;For more details and examples, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/rest-api/&quot;&gt;REST API documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Billing - Modernized Billing Profile with new payment options</title><link>https://developers.cloudflare.com/changelog/post/2026-05-21-modernised-billing-profile/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-21-modernised-billing-profile/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/billing/get-started/update-billing-info/&quot;&gt;Billing Profile&lt;/a&gt; now has a modern UI and a single space that unifies billing information, payment method management and an enhanced subscriptions view under a single &lt;strong&gt;Subscriptions&lt;/strong&gt; tab.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-changed&quot;&gt;What changed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;strong&gt;Subscriptions&lt;/strong&gt; tab brings billing information, payment method management, and your subscriptions together in one place. The payment management and &lt;strong&gt;Pay overdue balances&lt;/strong&gt; flows now use the latest checkout as product purchase flows, so you can pay with Apple Pay, Google Pay, Link, and &lt;a href=&quot;https://developers.cloudflare.com/billing/payment-methods/instant-bank-payments-link/&quot;&gt;Instant Bank Payments via Link&lt;/a&gt; alongside cards and PayPal.&lt;/p&gt;
&lt;p&gt;New cards complete 3D Secure authentication when the issuer requires it — for example, the EU under PSD2 and India under RBI.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=909,height=676,format=webp/_astro/2026-05-21-modernised-billing-profile.D6PysUnl.png&quot; alt=&quot;Modernized Billing Profile with the Subscriptions tab&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;909&quot; height=&quot;676&quot;&gt;
&lt;p&gt;For details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/billing/&quot;&gt;Billing Home&lt;/a&gt; documentation.&lt;/p&gt;</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><product>Billing</product><category>Billing</category></item><item><title>Cloudflare Fundamentals, Cloudflare One, Cloudflare Tunnel for SASE, Cloudflare Tunnel, Cloudflare Mesh - Granular permissions for Cloudflare Tunnel and Cloudflare Mesh</title><link>https://developers.cloudflare.com/changelog/post/2026-05-21-tunnel-mesh-granular-permissions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-21-tunnel-mesh-granular-permissions/</guid><description>&lt;p&gt;You can now scope Cloudflare permissions to individual &lt;a href=&quot;https://developers.cloudflare.com/tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; instances and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;Cloudflare Mesh&lt;/a&gt; nodes. Administrators can delegate access to specific Tunnels or Mesh nodes without granting account-wide control over private networking.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-is-new&quot;&gt;What is new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-is-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When you &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/manage/&quot;&gt;add a member&lt;/a&gt; or create a &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/policies/&quot;&gt;permission policy&lt;/a&gt;, the resource picker now lists &lt;a href=&quot;https://developers.cloudflare.com/tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; instances and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;Cloudflare Mesh&lt;/a&gt; nodes as scopable resource types. You can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Scope a single policy to one or many Tunnels and Mesh nodes at once.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;how-it-works&quot;&gt;How it works&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#how-it-works&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Granular permissions are a parallel layer to existing account-level roles — they do not replace them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Existing account-level roles continue to work.&lt;/strong&gt; A member with &lt;code&gt;Cloudflare Access&lt;/code&gt; or &lt;code&gt;Cloudflare Zero Trust&lt;/code&gt; retains write access to every Tunnel and Mesh node in the account. This ensures backward compatibility for existing automation and tokens.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Granular permissions are additive.&lt;/strong&gt; For any API request on a specific Tunnel or Mesh node, access is granted if the principal has &lt;strong&gt;either&lt;/strong&gt; the account-level role &lt;strong&gt;or&lt;/strong&gt; a granular permission for that resource.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource enumeration is authorization-aware.&lt;/strong&gt; Listing endpoints (&lt;code&gt;GET /accounts/{id}/cfd_tunnel&lt;/code&gt;, &lt;code&gt;GET /accounts/{id}/warp_connector&lt;/code&gt;) return only the resources the principal has at least read access to.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Configure &lt;a href=&quot;https://developers.cloudflare.com/tunnel/advanced/granular-permissions/&quot;&gt;granular permissions for Cloudflare Tunnel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Configure &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/granular-permissions/&quot;&gt;granular permissions for Cloudflare Tunnel and Cloudflare Mesh in Cloudflare One&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Review the &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/roles/#resource-scoped-roles&quot;&gt;resource-scoped roles&lt;/a&gt; on the Cloudflare role reference.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>Cloudflare One</category><category>Cloudflare Tunnel for SASE</category><category>Cloudflare Tunnel</category><category>Cloudflare Mesh</category></item><item><title>Workers VPC - Reach Cloudflare WAN destinations from Workers VPC</title><link>https://developers.cloudflare.com/changelog/post/2026-05-21-vpc-networks-cloudflare-wan/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-21-vpc-networks-cloudflare-wan/</guid><description>
&lt;p&gt;You can now use &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/&quot;&gt;VPC Network&lt;/a&gt; bindings with &lt;code&gt;network_id: &quot;cf1:network&quot;&lt;/code&gt; to reach your full private network from Workers, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;Cloudflare Mesh&lt;/a&gt; nodes and client devices&lt;/li&gt;
&lt;li&gt;Subnet routes and hostname routes announced through &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; or Cloudflare Mesh&lt;/li&gt;
&lt;li&gt;Destinations connected through &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/&quot;&gt;Cloudflare WAN&lt;/a&gt; on-ramps — GRE, IPsec, and CNI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;vpc_networks&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PRIVATE_NETWORK&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;network_id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf1:network&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;remote&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;vpc_networks&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PRIVATE_NETWORK&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;network_id = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf1:network&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;remote = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;At runtime, the URL you pass to &lt;code&gt;fetch()&lt;/code&gt; determines the destination:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Reach a service behind a Cloudflare WAN IPsec on-ramp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;PRIVATE_NETWORK&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;http://10.50.0.100:8080/api&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;For destinations behind Cloudflare WAN on-ramps (GRE, IPsec, or CNI), your network must route the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/how-to/configure-cloudflare-source-ips/&quot;&gt;Cloudflare source IP range&lt;/a&gt; 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.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;For configuration options, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/&quot;&gt;VPC Networks&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate><product>Workers VPC</product><category>Workers VPC</category></item><item><title>DNS - New DNS records UX is rolling out</title><link>https://developers.cloudflare.com/changelog/post/2026-05-20-new-dns-records-ux/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-20-new-dns-records-ux/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3706,height=2070,format=webp/_astro/new-dns-ux.Bfs_yXPa.png&quot; alt=&quot;New DNS records UX&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3706&quot; height=&quot;2070&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-is-new&quot;&gt;What is new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-is-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Better table experience&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;First-class mobile experience&lt;/strong&gt;: responsive layout with a touch-friendly, card-based UI and compact controls for small screens.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS quick reference&lt;/strong&gt;: bite-sized explainers for DNS, proxy status, and TTL, available directly in the product to help users configure records without leaving the page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modern frontend&lt;/strong&gt;: a refactor onto Cloudflare&apos;s new UI framework that improves performance and lays the foundation for future improvements.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=754,height=572,format=webp/_astro/new-dns-ux.DV6gCbme.gif&quot; alt=&quot;New DNS records UX&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;754&quot; height=&quot;572&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;rollout-plan&quot;&gt;Rollout plan&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#rollout-plan&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Dates are subject to change based on feedback received during the rollout.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;20 May - 05 June&lt;/strong&gt;: ramped rollout to Free, then Pro and Business plans.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;08 June - 03 July&lt;/strong&gt;: ramped rollout to Enterprise plans.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;share-your-feedback&quot;&gt;Share your feedback&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#share-your-feedback&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><product>DNS</product><category>DNS</category></item><item><title>Radar - Content type distribution and API traffic share on Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-05-20-radar-content-type-and-api-traffic/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-20-radar-content-type-and-api-traffic/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; now includes two new charts on the &lt;a href=&quot;https://radar.cloudflare.com/traffic&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;traffic page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; that provide deeper insights into the composition of HTTP traffic: a content type distribution chart and an API traffic share chart.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;content-type-distribution&quot;&gt;Content type distribution&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#content-type-distribution&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The new &lt;a href=&quot;https://radar.cloudflare.com/traffic#content-type&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Content type&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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 &lt;a href=&quot;https://radar.cloudflare.com/traffic#bot-vs-human&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Bot vs. Human&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; chart also gained a content type category filter, allowing users to see the bot/human split for specific content categories.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=878,format=webp/_astro/content-type-distribution.Dz2q1n6W.png&quot; alt=&quot;Screenshot of the content type distribution chart on the Radar traffic page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;878&quot;&gt;
&lt;p&gt;Content type categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTML&lt;/strong&gt; — Web pages (&lt;code&gt;text/html&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Images&lt;/strong&gt; — All image formats (&lt;code&gt;image/*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSON&lt;/strong&gt; — JSON data and API responses (&lt;code&gt;application/json&lt;/code&gt;, &lt;code&gt;*+json&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript&lt;/strong&gt; — Scripts (&lt;code&gt;application/javascript&lt;/code&gt;, &lt;code&gt;text/javascript&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSS&lt;/strong&gt; — Stylesheets (&lt;code&gt;text/css&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plain Text&lt;/strong&gt; — Unformatted text (&lt;code&gt;text/plain&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fonts&lt;/strong&gt; — Web fonts (&lt;code&gt;font/*&lt;/code&gt;, &lt;code&gt;application/font-*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;XML&lt;/strong&gt; — XML documents and feeds (&lt;code&gt;text/xml&lt;/code&gt;, &lt;code&gt;application/xml&lt;/code&gt;, &lt;code&gt;application/rss+xml&lt;/code&gt;, &lt;code&gt;application/atom+xml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;YAML&lt;/strong&gt; — Configuration files (&lt;code&gt;text/yaml&lt;/code&gt;, &lt;code&gt;application/yaml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Video&lt;/strong&gt; — Video content and streaming (&lt;code&gt;video/*&lt;/code&gt;, &lt;code&gt;application/ogg&lt;/code&gt;, &lt;code&gt;*mpegurl&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audio&lt;/strong&gt; — Audio content (&lt;code&gt;audio/*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markdown&lt;/strong&gt; — Markdown documents (&lt;code&gt;text/markdown&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documents&lt;/strong&gt; — PDFs, Office documents, ePub, CSV (&lt;code&gt;application/pdf&lt;/code&gt;, &lt;code&gt;application/msword&lt;/code&gt;, &lt;code&gt;text/csv&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Binary&lt;/strong&gt; — Executables, archives, WebAssembly (&lt;code&gt;application/octet-stream&lt;/code&gt;, &lt;code&gt;application/zip&lt;/code&gt;, &lt;code&gt;application/wasm&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Serialization&lt;/strong&gt; — Binary API formats (&lt;code&gt;application/protobuf&lt;/code&gt;, &lt;code&gt;application/grpc&lt;/code&gt;, &lt;code&gt;application/msgpack&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Other&lt;/strong&gt; — All other content types&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;CONTENT_TYPE&lt;/code&gt; dimension and &lt;code&gt;contentType&lt;/code&gt; filter are available on the HTTP &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/http/methods/summary_v2/&quot;&gt;summary&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/http/methods/timeseries_groups_v2/&quot;&gt;timeseries groups&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/http/methods/timeseries/&quot;&gt;timeseries&lt;/a&gt; endpoints.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;api-traffic-share&quot;&gt;API traffic share&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#api-traffic-share&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The new &lt;a href=&quot;https://radar.cloudflare.com/traffic#api-traffic&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;API traffic&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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 (&lt;code&gt;application/json&lt;/code&gt;, &lt;code&gt;application/xml&lt;/code&gt;, &lt;code&gt;text/xml&lt;/code&gt;) on HTTP requests that returned a 200 status code. A traffic type selector allows switching between human traffic, bot traffic, or all traffic.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1006,format=webp/_astro/api-traffic-share._xl0TThn.png&quot; alt=&quot;Screenshot of the API traffic share chart on the Radar traffic page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;1006&quot;&gt;
&lt;p&gt;The &lt;code&gt;API_TRAFFIC&lt;/code&gt; dimension is available on the existing HTTP &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/http/methods/summary_v2/&quot;&gt;summary&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/http/methods/timeseries_groups_v2/&quot;&gt;timeseries groups&lt;/a&gt; endpoints. An &lt;code&gt;apiTraffic&lt;/code&gt; filter (&lt;code&gt;API&lt;/code&gt; or &lt;code&gt;NON_API&lt;/code&gt;) can also be applied to &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/http/methods/timeseries/&quot;&gt;HTTP timeseries&lt;/a&gt; requests to retrieve raw request counts for API-only or non-API traffic.&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://radar.cloudflare.com/traffic&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Radar traffic page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to explore these new charts.&lt;/p&gt;</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>WAF - WAF Release - 2026-05-20</title><link>https://developers.cloudflare.com/changelog/post/2026-05-20-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-20-waf-release/</guid><description>
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Existing rule enhancements have been deployed to improve detection resilience against broad classes of web attacks and strengthen behavioral coverage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Continuous Rule Improvements&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;bcdcec3ea63a480896513dc39e9c068d&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...9e9c068d&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Sitecore - Cache Poisoning - CVE:CVE-2025-53693 Beta&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This rule is merged into the original rule &quot;Sitecore - Cache Poisoning - CVE:CVE-2025-53693&quot; (ID: &lt;rule-id id=&quot;d1bd7563e6254db48ce703807c5b669c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...7c5b669c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;).&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Wed, 20 May 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Access - Cloudflare as identity provider and account membership selector</title><link>https://developers.cloudflare.com/changelog/post/2026-05-19-cloudflare-as-identity-provider/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-19-cloudflare-as-identity-provider/</guid><description>&lt;p&gt;Cloudflare Access now supports using Cloudflare itself as an &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/cloudflare/&quot;&gt;identity provider&lt;/a&gt;. 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&apos;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.&lt;/p&gt;
&lt;p&gt;Cloudflare is now the &lt;strong&gt;default identity provider for all newly created Zero Trust accounts&lt;/strong&gt;, replacing One-time PIN.&lt;/p&gt;
&lt;p&gt;This also enables two new capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Account Member selector&lt;/strong&gt; — A new &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/#cloudflare-access-selectors&quot;&gt;policy selector&lt;/a&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Restrict to account members&lt;/strong&gt; — An identity provider configuration option that limits authentication to users who are members of your Cloudflare account.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, add Cloudflare as an &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/cloudflare/&quot;&gt;identity provider&lt;/a&gt; in your Zero Trust settings.&lt;/p&gt;</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Artifacts, Queues - Event subscriptions for Artifacts lifecycle events</title><link>https://developers.cloudflare.com/changelog/post/2026-05-19-event-subscriptions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-19-event-subscriptions/</guid><description>&lt;p&gt;You can now receive &lt;a href=&quot;https://developers.cloudflare.com/queues/event-subscriptions/&quot;&gt;event notifications&lt;/a&gt; for &lt;a href=&quot;https://developers.cloudflare.com/artifacts/&quot;&gt;Artifacts&lt;/a&gt; repository changes and consume them from a Worker to build commit-driven automation.&lt;/p&gt;
&lt;p&gt;This allows you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run custom workflows when a repository is created or imported&lt;/li&gt;
&lt;li&gt;Kick off a build and deploy a change when an agent pushes to a repo&lt;/li&gt;
&lt;li&gt;Trigger a review agent on every push&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Available events include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Account-level events&lt;/strong&gt; (&lt;code&gt;artifacts&lt;/code&gt; source) — &lt;code&gt;repo.created&lt;/code&gt;, &lt;code&gt;repo.deleted&lt;/code&gt;, &lt;code&gt;repo.forked&lt;/code&gt;, &lt;code&gt;repo.imported&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository-level events&lt;/strong&gt; (&lt;code&gt;artifacts.repo&lt;/code&gt; source) — &lt;code&gt;pushed&lt;/code&gt;, &lt;code&gt;cloned&lt;/code&gt;, &lt;code&gt;fetched&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To learn more, refer to &lt;a href=&quot;https://developers.cloudflare.com/artifacts/guides/event-subscriptions/&quot;&gt;Artifacts documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><product>Artifacts</product><category>Artifacts</category><category>Queues</category></item><item><title>CASB - CASB adds support for Claude Compliance API</title><link>https://developers.cloudflare.com/changelog/post/2026-05-19-casb-claude-compliance-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-19-casb-claude-compliance-api/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/cloud-and-saas/anthropic/&quot;&gt;Cloudflare CASB&lt;/a&gt; now integrates with the &lt;a href=&quot;https://support.claude.com/en/articles/13015708-access-the-compliance-api&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Claude Compliance API&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. This enhancement gives security teams visibility into Claude usage patterns, admin activity, and compliance-relevant events across their organization.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-capabilities&quot;&gt;Key capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Starting today, security teams can scan for security findings across the following assets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Public projects&lt;/strong&gt; — Projects set to public visibility&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Project attachment&lt;/strong&gt; — Files and documents added to projects that violate DLP policies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chat files&lt;/strong&gt; — User-uploaded and provider-generated files that violate DLP policies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chat messages&lt;/strong&gt; — User prompts and provider responses that violate DLP policies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Artifacts&lt;/strong&gt; — Provider-generated documents and files that violate DLP policies&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;learn-more&quot;&gt;Learn more&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#learn-more&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;This &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/cloud-and-saas/anthropic/&quot;&gt;integration&lt;/a&gt; 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.&lt;/p&gt;</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><product>CASB</product><category>CASB</category></item><item><title>Radar - MRT Explorer on Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-05-19-radar-mrt-explorer/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-19-radar-mrt-explorer/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; now includes an &lt;a href=&quot;https://radar.cloudflare.com/routing/mrt-explorer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MRT Explorer&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;loading-a-file&quot;&gt;Loading a file&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#loading-a-file&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2428,height=898,format=webp/_astro/mrt-explorer-form.DKnzUqMC.png&quot; alt=&quot;Screenshot of the MRT Explorer file input form&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2428&quot; height=&quot;898&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;inspecting-events&quot;&gt;Inspecting events&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#inspecting-events&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Once parsed, the tool lists every BGP event with its timestamp, prefix, AS path, OTC (Only to Customer), and community attributes.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2410,height=1536,format=webp/_astro/mrt-explorer-list.8fq2u5Kc.png&quot; alt=&quot;Screenshot of the MRT Explorer event list&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2410&quot; height=&quot;1536&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;event-details&quot;&gt;Event details&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#event-details&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Clicking on the &quot;View details&quot; action opens a modal with additional properties and the full event JSON.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1694,height=1890,format=webp/_astro/mrt-explorer-details.EMcHevWw.png&quot; alt=&quot;Screenshot of the MRT Explorer event details modal&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1694&quot; height=&quot;1890&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;shareable-urls&quot;&gt;Shareable URLs&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#shareable-urls&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When loading a file by URL, the query string captures the source so the link can be shared directly — the recipient&apos;s browser immediately fetches and parses the same file.&lt;/p&gt;
&lt;p&gt;Try the &lt;a href=&quot;https://radar.cloudflare.com/routing/mrt-explorer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MRT Explorer on Cloudflare Radar&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Artifacts - Manage Artifacts namespaces and repos with Wrangler CLI</title><link>https://developers.cloudflare.com/changelog/post/2026-05-18-wrangler-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-18-wrangler-support/</guid><description>&lt;p&gt;You can now manage &lt;a href=&quot;https://developers.cloudflare.com/artifacts/&quot;&gt;Artifacts&lt;/a&gt; namespaces, repos, and repo-scoped tokens directly from Wrangler CLI.&lt;/p&gt;
&lt;p&gt;Available commands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wrangler artifacts namespaces list&lt;/code&gt; — List Artifacts namespaces in your account.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler artifacts namespaces get&lt;/code&gt; — Get metadata for a namespace.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler artifacts repos create&lt;/code&gt; — Create a repo in a namespace.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler artifacts repos list&lt;/code&gt; — List repos in a namespace.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler artifacts repos get&lt;/code&gt; — Get metadata for a repo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler artifacts repos delete&lt;/code&gt; — Delete a repo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler artifacts repos issue-token&lt;/code&gt; — Issue a repo-scoped token for Git access.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/artifacts/&quot;&gt;Wrangler Artifacts commands documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate><product>Artifacts</product><category>Artifacts</category></item><item><title>Cloudflare WAN, Magic Transit - Network Analytics support for Unified Routing</title><link>https://developers.cloudflare.com/changelog/post/2026-05-18-unified-routing-network-analytics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-18-unified-routing-network-analytics/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/network-analytics/&quot;&gt;Network Analytics&lt;/a&gt; is now fully supported for accounts using &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/reference/traffic-steering/#unified-routing-mode-beta&quot;&gt;Unified Routing&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For the remaining beta limitations, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/reference/traffic-steering/#beta-limitations&quot;&gt;Traffic steering beta limitations&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate><product>Cloudflare WAN</product><category>Cloudflare WAN</category><category>Magic Transit</category></item><item><title>Workers - Share local dev servers through Cloudflare Tunnel in Wrangler and Vite</title><link>https://developers.cloudflare.com/changelog/post/2026-05-18-local-dev-tunnels/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-18-local-dev-tunnels/</guid><description>&lt;p&gt;You can now share local dev sessions through &lt;a href=&quot;https://developers.cloudflare.com/tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; and get a public URL when using either &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt; or the &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/&quot;&gt;Cloudflare Vite plugin&lt;/a&gt;. This is useful when you need to share a preview, test a webhook, or access your app from another device.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1000,height=678,format=webp/_astro/vite-local-dev-tunnel.CW4xpgIR.gif&quot; alt=&quot;Vite local dev tunnel demo&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1000&quot; height=&quot;678&quot;&gt;
&lt;p&gt;This lets you either:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;start a temporary &lt;a href=&quot;https://developers.cloudflare.com/tunnel/setup/#quick-tunnels-development&quot;&gt;Quick tunnel&lt;/a&gt; with a random &lt;code&gt;*.trycloudflare.com&lt;/code&gt; hostname, or&lt;/li&gt;
&lt;li&gt;use an existing &lt;a href=&quot;https://developers.cloudflare.com/tunnel/setup/#create-a-tunnel&quot;&gt;named tunnel&lt;/a&gt; for a stable hostname and to restrict access with &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/&quot;&gt;Cloudflare Access&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To start a tunnel, press &lt;code&gt;t&lt;/code&gt; in Wrangler or &lt;code&gt;t + Enter&lt;/code&gt; in Vite while your dev server is running. For details on setting up a named tunnel, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/local-development/local-dev-tunnels/&quot;&gt;Share a local dev server&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 18 May 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Hyperdrive, Workers - Hyperdrive exposes database connection pool size metrics</title><link>https://developers.cloudflare.com/changelog/post/2026-05-15-hyperdrive-pool-size-metrics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-15-hyperdrive-pool-size-metrics/</guid><description>&lt;p&gt;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 &lt;code&gt;hyperdrivePoolSizesAdaptiveGroups&lt;/code&gt; dataset in the &lt;a href=&quot;https://developers.cloudflare.com/analytics/graphql-api/getting-started/&quot;&gt;GraphQL Analytics API&lt;/a&gt;, you can see &lt;code&gt;waitingClients&lt;/code&gt;, &lt;code&gt;currentPoolSize&lt;/code&gt;, &lt;code&gt;availablePoolSlots&lt;/code&gt;, and &lt;code&gt;maxPoolSize&lt;/code&gt; for each of your configurations.&lt;/p&gt;
&lt;p&gt;A new &lt;strong&gt;Pool connections&lt;/strong&gt; chart has been added to the &lt;strong&gt;Metrics&lt;/strong&gt; tab of each Hyperdrive configuration in the &lt;a href=&quot;https://dash.cloudflare.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. You can use the location selector to drill down into specific locations hosting your connection pool by airport code.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2604,height=890,format=webp/_astro/hyperdrive-pool-size-metrics-chart.DZxLTFgB.png&quot; alt=&quot;Hyperdrive pool size metrics chart&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2604&quot; height=&quot;890&quot;&gt;
&lt;p&gt;The chart shows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Waiting clients&lt;/strong&gt;: Client requests waiting for an available connection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Open connections&lt;/strong&gt;: Active connections to your database.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pool size maximum&lt;/strong&gt;: Your configured origin connection limit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/platform/limits/#request-a-limit-increase&quot;&gt;increase your Hyperdrive connection limit&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;pool-size-metrics&quot;&gt;Pool size metrics&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#pool-size-metrics&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;hyperdrivePoolSizesAdaptiveGroups&lt;/code&gt; dataset in the &lt;a href=&quot;https://developers.cloudflare.com/analytics/graphql-api/getting-started/&quot;&gt;GraphQL Analytics API&lt;/a&gt; exposes the following key connection pool metrics for each Hyperdrive configuration:&lt;/p&gt;
&lt;p&gt;Under &lt;code&gt;avg&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;currentPoolSize&lt;/code&gt;&lt;/strong&gt; — Average number of connections currently open in the pool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;availablePoolSlots&lt;/code&gt;&lt;/strong&gt; — Average number of pool connections available for checkout.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;waitingClients&lt;/code&gt;&lt;/strong&gt; — Average number of clients waiting for a connection from the pool.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Under &lt;code&gt;max&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;maxPoolSize&lt;/code&gt;&lt;/strong&gt; — Configured maximum size of the connection pool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;currentPoolSize&lt;/code&gt;&lt;/strong&gt; — Peak number of connections open in the pool.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;waitingClients&lt;/code&gt;&lt;/strong&gt; — Peak number of clients waiting for a connection from the pool.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/observability/metrics/&quot;&gt;Metrics and analytics&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/concepts/connection-pooling/&quot;&gt;Connection pooling&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category><category>Workers</category></item><item><title>R2 SQL - R2 SQL now supports JOINs, subqueries, and multi-table queries</title><link>https://developers.cloudflare.com/changelog/post/2026-05-14-joins-subqueries-multi-table-queries/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-14-joins-subqueries-multi-table-queries/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; is Cloudflare&apos;s serverless, distributed SQL engine for querying &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables stored in &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;. R2 SQL runs directly on Cloudflare&apos;s global network with no infrastructure to manage, so you can analyze data in R2 without exporting it to an external warehouse.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-capabilities&quot;&gt;New capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JOINs&lt;/strong&gt; — &lt;code&gt;INNER JOIN&lt;/code&gt;, &lt;code&gt;LEFT JOIN&lt;/code&gt;, &lt;code&gt;RIGHT JOIN&lt;/code&gt;, &lt;code&gt;FULL OUTER JOIN&lt;/code&gt;, &lt;code&gt;CROSS JOIN&lt;/code&gt;, and implicit joins (comma-separated &lt;code&gt;FROM&lt;/code&gt; with conditions in &lt;code&gt;WHERE&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subqueries&lt;/strong&gt; — &lt;code&gt;IN&lt;/code&gt; / &lt;code&gt;NOT IN&lt;/code&gt;, &lt;code&gt;EXISTS&lt;/code&gt; / &lt;code&gt;NOT EXISTS&lt;/code&gt;, scalar subqueries in &lt;code&gt;SELECT&lt;/code&gt; / &lt;code&gt;WHERE&lt;/code&gt; / &lt;code&gt;HAVING&lt;/code&gt;, and derived tables (subqueries in &lt;code&gt;FROM&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-table CTEs&lt;/strong&gt; — &lt;code&gt;WITH&lt;/code&gt; clauses can reference different tables and include JOINs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-joins&lt;/strong&gt; — join a table with itself using different aliases&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-way joins&lt;/strong&gt; — join three or more tables in a single query&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;examples&quot;&gt;Examples&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#examples&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;two-table-join-with-aggregation&quot;&gt;Two-table JOIN with aggregation&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#two-table-join-with-aggregation&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;plan&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; request_count&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zones&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; z&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;INNER JOIN&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;http_requests&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; h &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ON&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; h&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;plan&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;enterprise&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;plan&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; request_count &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;exists-subquery&quot;&gt;&lt;code&gt;EXISTS&lt;/code&gt; subquery&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#exists-subquery&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;domain&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;plan&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zones&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; z&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; EXISTS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;firewall_events&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; f&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; f&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; AND&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; f&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;action&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;block&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; z&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;domain&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;multi-table-cte-with-join&quot;&gt;Multi-table CTE with JOIN&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#multi-table-cte-with-join&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WITH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; top_zones &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; req_count&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;http_requests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; req_count &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 50&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;zone_threats &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; threat_count&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;firewall_events&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; risk_score &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tz&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;tz&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;req_count&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COALESCE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zt&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;threat_count&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; threat_count&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; top_zones tz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LEFT JOIN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; zone_threats zt &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ON&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tz&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; zt&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;zone_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tz&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;req_count&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For the full syntax reference, refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. For performance guidance with joins, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/&quot;&gt;Limitations and best practices&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>WAF - WAF Release - 2026-05-15 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2026-05-15-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-15-emergency-waf-release/</guid><description>
&lt;p&gt;This emergency release introduces two new rules to detect nginx heap buffer overflow and heap spray exploitation attempts targeting the rewrite module&apos;s &lt;code&gt;is_args&lt;/code&gt; stale-state bug (CVE-2026-42945).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CVE-2026-42945: nginx Heap Buffer Overflow via Stale &lt;code&gt;is_args&lt;/code&gt; in Rewrite Module&lt;/p&gt;
&lt;p&gt;Successful exploitation allows remote attackers to trigger a heap buffer overflow in nginx&apos;s rewrite module by sending crafted URIs containing escapable characters. A length/copy pass mismatch in &lt;code&gt;ngx_http_script_copy_capture_code()&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;We strongly recommend upgrading to nginx 1.30.1 (or later) immediately to address the underlying vulnerability. If you cannot upgrade immediately, avoid &lt;code&gt;rewrite&lt;/code&gt; directives with &lt;code&gt;?&lt;/code&gt; in the replacement string followed by &lt;code&gt;set&lt;/code&gt; or &lt;code&gt;if&lt;/code&gt; referencing capture groups.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;2013e3e58efe4b79a26e214f7e52be73&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...7e52be73&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;nginx - Remote Code Execution - Buffer Overread - CVE:CVE-2026-42945&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;68226e83a4d14ee9a9c878469df0ee6c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...9df0ee6c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;nginx - Remote Code Execution - Heap Spray - CVE:CVE-2026-42945&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Fri, 15 May 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - New Domains tab in the Workers dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-05-14-domains-tab/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-14-domains-tab/</guid><description>
&lt;p&gt;In your Worker&apos;s dashboard, there is now a dedicated &lt;strong&gt;Domains&lt;/strong&gt; tab where you can purchase a new domain through Cloudflare Registrar and have it automatically connected, add an &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/routing/custom-domains/&quot;&gt;existing domain&lt;/a&gt;, and manage all of your Worker&apos;s routing in one place.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1678,height=1026,format=webp/_astro/domains-tab.Cey2Oyr-.png&quot; alt=&quot;The new Domains tab in the Workers dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1678&quot; height=&quot;1026&quot;&gt;
&lt;p&gt;You can also enable or disable your &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/routing/workers-dev/&quot;&gt;&lt;code&gt;workers.dev&lt;/code&gt; subdomain&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/&quot;&gt;Preview URLs&lt;/a&gt;, put them behind &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/&quot;&gt;Cloudflare Access&lt;/a&gt; to require sign-in, and jump directly to &lt;a href=&quot;https://developers.cloudflare.com/analytics/&quot;&gt;analytics&lt;/a&gt; or domain overview for any connected domain.&lt;/p&gt;
&lt;p&gt;To get started, go to &lt;strong&gt;Workers &amp;amp; Pages&lt;/strong&gt;, select a Worker, and open the &lt;strong&gt;Domains&lt;/strong&gt; tab.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Workers &amp;amp; Pages&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;</description><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Agents, Workers - Agents SDK v0.12.4: chat recovery, routing retries, durable Think submissions, and Voice connection control</title><link>https://developers.cloudflare.com/changelog/post/2026-05-13-agents-sdk-v0.12.4/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-13-agents-sdk-v0.12.4/</guid><description>
&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;chat-recovery-improvements&quot;&gt;Chat recovery improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#chat-recovery-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; 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 &lt;code&gt;stop()&lt;/code&gt; still cancels the server turn.&lt;/p&gt;
&lt;p&gt;Set &lt;code&gt;cancelOnClientAbort: true&lt;/code&gt; if browser or client aborts should also cancel the server turn:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; chat&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useAgentChat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	cancelOnClientAbort: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;tsx&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;tsx&quot; data-nb-lang=&quot;tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; chat&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useAgentChat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	cancelOnClientAbort: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;Notable bug fixes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chat stream resume negotiation no longer throws when replay races with a closed WebSocket connection.&lt;/li&gt;
&lt;li&gt;Recovered chat continuations no longer leave &lt;code&gt;useAgentChat&lt;/code&gt; stuck in a streaming state when the original socket disconnects before a terminal response.&lt;/li&gt;
&lt;li&gt;Approval auto-continuation preserves reasoning parts and persists continuation reasoning in the final message.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;isServerStreaming&lt;/code&gt; now resets correctly when a resumed stream moves from the fallback observer path to a transport-owned stream.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;agent-state-and-routing-fixes&quot;&gt;Agent state and routing fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#agent-state-and-routing-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;agents@0.12.4&lt;/code&gt; prevents duplicate initial state frames during WebSocket connection setup. This avoids stale initial state messages overwriting state updates already sent by the client.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;getAgentByName()&lt;/code&gt; now supports &lt;code&gt;routingRetry&lt;/code&gt; for transient Durable Object routing failures:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { getAgentByName } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getAgentByName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env.AssistantAgent, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	routingRetry: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		maxAttempts: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { getAgentByName } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getAgentByName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env.AssistantAgent, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	routingRetry: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		maxAttempts: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;durable-think-submissions&quot;&gt;Durable Think submissions&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#durable-think-submissions&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/think&lt;/code&gt; now supports durable programmatic submissions. &lt;code&gt;submitMessages()&lt;/code&gt; provides durable acceptance, idempotent retries, status inspection, cancellation, and cleanup for server-driven turns that should continue after the caller returns.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Think.chat()&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ChatOptions.tools&lt;/code&gt; has been removed from the TypeScript API. Define durable tools on the child agent or use agent tools for orchestration. Runtime &lt;code&gt;options.tools&lt;/code&gt; values passed by legacy callers are ignored with a warning.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;think-message-pruning-behavior-change&quot;&gt;Think message pruning behavior change&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#think-message-pruning-behavior-change&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/think&lt;/code&gt; no longer applies &lt;code&gt;pruneMessages({ toolCalls: &quot;before-last-2-messages&quot; })&lt;/code&gt; to model context by default. The previous default could strip client-side tool results from longer multi-turn flows.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;truncateOlderMessages&lt;/code&gt; still runs as before, so context cost remains bounded. Subclasses that relied on the old aggressive pruning can opt back in from &lt;code&gt;beforeTurn&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { pruneMessages } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	beforeTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			messages: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;pruneMessages&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				messages: ctx.messages,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				toolCalls: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;before-last-2-messages&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Think } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/think&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { pruneMessages } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Think&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	beforeTurn&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			messages: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;pruneMessages&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				messages: ctx.messages,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				toolCalls: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;before-last-2-messages&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;voice-agent-connection-control&quot;&gt;Voice agent connection control&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#voice-agent-connection-control&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;@cloudflare/voice&lt;/code&gt; adds an &lt;code&gt;enabled&lt;/code&gt; option to &lt;code&gt;useVoiceAgent&lt;/code&gt;. React apps can now delay creating and connecting a &lt;code&gt;VoiceClient&lt;/code&gt; until prerequisites such as capability tokens are ready.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; voice&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useVoiceAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MyVoiceAgent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	enabled: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Boolean&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(token),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;tsx&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;tsx&quot; data-nb-lang=&quot;tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; voice&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useVoiceAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MyVoiceAgent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	enabled: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Boolean&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(token),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This release also fixes Workers AI speech-to-text session edge cases and &lt;code&gt;withVoice&lt;/code&gt; text streaming from AI SDK &lt;code&gt;textStream&lt;/code&gt; responses.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;other-improvements&quot;&gt;Other improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#other-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Streamable HTTP routing&lt;/strong&gt; — Server-to-client requests now route through the originating POST stream when no standalone SSE stream is available.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured tool output&lt;/strong&gt; — Tool output shapes are preserved when truncating older messages or oversized persisted rows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Non-chat Think tool steps&lt;/strong&gt; — Think agent-tool children can complete without emitting assistant text and can return structured output through &lt;code&gt;getAgentToolOutput&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sub-agent schedules&lt;/strong&gt; — Stale sub-agent schedule rows are pruned when their owning facet registry entry no longer exists.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;@cloudflare/codemode&lt;/code&gt;&lt;/strong&gt; — Adds a browser-safe export with an iframe sandbox executor and resolves OpenAPI specs inside the sandbox to avoid Worker Loader RPC size limits.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; agents@latest&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/ai-chat@latest&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/think@latest&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/voice@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/agents/runtime/&quot;&gt;Agents API reference&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/agents/communication-channels/chat/chat-agents/&quot;&gt;Chat agents documentation&lt;/a&gt; for more information.&lt;/p&gt;</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Logs - New Logpush datasets and updated fields across multiple Logpush datasets in Cloudflare Logs</title><link>https://developers.cloudflare.com/changelog/post/2026-05-13-log-fields-updated/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-13-log-fields-updated/</guid><description>&lt;p&gt;Cloudflare has updated &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/&quot;&gt;Logpush datasets&lt;/a&gt;:&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-datasets&quot;&gt;New datasets&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-datasets&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Email Security Post-Delivery Events&lt;/strong&gt;: A new dataset with fields including &lt;code&gt;AlertID&lt;/code&gt;, &lt;code&gt;CompletedAt&lt;/code&gt;, &lt;code&gt;Destination&lt;/code&gt;, &lt;code&gt;FinalDisposition&lt;/code&gt;, &lt;code&gt;Folder&lt;/code&gt;, &lt;code&gt;From&lt;/code&gt;, &lt;code&gt;FromName&lt;/code&gt;, &lt;code&gt;MessageID&lt;/code&gt;, &lt;code&gt;MessageTimestamp&lt;/code&gt;, &lt;code&gt;MicrosoftTenantID&lt;/code&gt;, &lt;code&gt;Operation&lt;/code&gt;, &lt;code&gt;PostfixID&lt;/code&gt;, &lt;code&gt;Reasons&lt;/code&gt;, &lt;code&gt;Recipient&lt;/code&gt;, &lt;code&gt;RequestedAt&lt;/code&gt;, &lt;code&gt;RequestedBy&lt;/code&gt;, &lt;code&gt;RequestedDisposition&lt;/code&gt;, &lt;code&gt;Status&lt;/code&gt;, &lt;code&gt;Subject&lt;/code&gt;, &lt;code&gt;Success&lt;/code&gt;, and &lt;code&gt;To&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magic Network Monitoring Flow Logs&lt;/strong&gt;: A new dataset with fields including &lt;code&gt;AWSVPCFlowJSON&lt;/code&gt;, &lt;code&gt;Bits&lt;/code&gt;, &lt;code&gt;DestinationAS&lt;/code&gt;, &lt;code&gt;DestinationAddress&lt;/code&gt;, &lt;code&gt;DestinationPort&lt;/code&gt;, &lt;code&gt;DeviceID&lt;/code&gt;, &lt;code&gt;EgressBits&lt;/code&gt;, &lt;code&gt;EgressPackets&lt;/code&gt;, &lt;code&gt;Ethertype&lt;/code&gt;, &lt;code&gt;FlowProtocol&lt;/code&gt;, &lt;code&gt;FlowTimestamp&lt;/code&gt;, &lt;code&gt;NumFlows&lt;/code&gt;, &lt;code&gt;PacketID&lt;/code&gt;, &lt;code&gt;Packets&lt;/code&gt;, &lt;code&gt;Protocol&lt;/code&gt;, &lt;code&gt;RuleIDs&lt;/code&gt;, &lt;code&gt;SampleRate&lt;/code&gt;, &lt;code&gt;SampleRateType&lt;/code&gt;, &lt;code&gt;SamplerAddress&lt;/code&gt;, &lt;code&gt;SourceAS&lt;/code&gt;, &lt;code&gt;SourceAddress&lt;/code&gt;, &lt;code&gt;SourcePort&lt;/code&gt;, &lt;code&gt;TcpFlags&lt;/code&gt;, and &lt;code&gt;Timestamp&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;updated-fields-in-existing-datasets&quot;&gt;Updated fields in existing datasets&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#updated-fields-in-existing-datasets&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Firewall events&lt;/strong&gt; (added): &lt;code&gt;AISecurityInjectionScore&lt;/code&gt;, &lt;code&gt;AISecurityPIICategories&lt;/code&gt;, &lt;code&gt;AISecurityTokenCount&lt;/code&gt;, and &lt;code&gt;AISecurityUnsafeTopicCategories&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP requests&lt;/strong&gt; (added): &lt;code&gt;AISecurityInjectionScore&lt;/code&gt;, &lt;code&gt;AISecurityPIICategories&lt;/code&gt;, &lt;code&gt;AISecurityTokenCount&lt;/code&gt;, &lt;code&gt;AISecurityUnsafeTopicCategories&lt;/code&gt;, and &lt;code&gt;Subrequests&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the complete field definitions for each dataset, refer to &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/&quot;&gt;Logpush datasets&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>Cloudflare Web Analytics - /cdn-cgi/rum endpoint now returns 405 for non-POST requests</title><link>https://developers.cloudflare.com/changelog/post/2026-05-13-rum-405-method-not-allowed/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-13-rum-405-method-not-allowed/</guid><description>&lt;p&gt;The &lt;code&gt;/cdn-cgi/rum&lt;/code&gt; beacon endpoint now returns &lt;code&gt;405 Method Not Allowed&lt;/code&gt; for non-POST requests instead of &lt;code&gt;404 Not Found&lt;/code&gt;. The response includes an &lt;code&gt;Allow: POST, OPTIONS&lt;/code&gt; header per &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9110#section-15.5.6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 9110 §15.5.6&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Previously, sending a &lt;code&gt;GET&lt;/code&gt; or other non-POST request to this endpoint returned a &lt;code&gt;404&lt;/code&gt;, which was misleading because it suggested the endpoint did not exist. The new &lt;code&gt;405&lt;/code&gt; response clearly indicates that the endpoint exists but only accepts &lt;code&gt;POST&lt;/code&gt; requests.&lt;/p&gt;
&lt;p&gt;The Web Analytics beacon (&lt;code&gt;beacon.min.js&lt;/code&gt;) already uses &lt;code&gt;POST&lt;/code&gt; for all metric submissions, so this change does not affect normal beacon operation. &lt;code&gt;OPTIONS&lt;/code&gt; requests for CORS preflight continue to work as before.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/web-analytics/faq/#why-am-i-getting-a-405-method-not-allowed-error-from-cdn-cgirum&quot;&gt;Web Analytics FAQ&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate><product>Cloudflare Web Analytics</product><category>Cloudflare Web Analytics</category></item><item><title>Cloudflare One, Access - Refreshed Access login page</title><link>https://developers.cloudflare.com/changelog/post/2026-05-12-access-login-page-refresh/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-12-access-login-page-refresh/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/reusable-components/custom-pages/access-login-page/&quot;&gt;Access login page&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/one-time-pin/&quot;&gt;one-time password (OTP)&lt;/a&gt; page now feature a refreshed design that improves visual consistency, user trust, and mobile responsiveness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=532,height=906,format=webp/_astro/access-login-old.CwNVkCQH.png&quot; alt=&quot;Screenshot of the previous Access login page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;532&quot; height=&quot;906&quot;&gt;
&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=541,height=722,format=webp/_astro/access-login-new.Y7WUfg9G.png&quot; alt=&quot;Screenshot of the updated Access login page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;541&quot; height=&quot;722&quot;&gt;
&lt;p&gt;The updated login experience includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unified authentication card&lt;/strong&gt; - 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistent button styling&lt;/strong&gt; - Identity provider buttons use a uniform size and layout for easier scanning and selection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better mobile experience&lt;/strong&gt; - Responsive layout improvements ensure the login page renders correctly on phones and tablets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dark mode support&lt;/strong&gt; - The login page now supports dark mode.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category><category>Access</category></item><item><title>Cloudflare WAN, Magic Transit, Cloudflare One - New accounts assigned a single IPv4 anycast address</title><link>https://developers.cloudflare.com/changelog/post/2026-05-12-single-anycast-ip-default/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-12-single-anycast-ip-default/</guid><description>&lt;p&gt;New Magic Transit and Cloudflare WAN accounts are now assigned a single IPv4 anycast address by default.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To request additional anycast IP addresses for your account, contact your account team.&lt;/p&gt;
&lt;p&gt;For tunnel configuration guidance, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/how-to/configure-tunnel-endpoints/&quot;&gt;Configure tunnel endpoints&lt;/a&gt; for Cloudflare WAN or &lt;a href=&quot;https://developers.cloudflare.com/magic-transit/how-to/configure-tunnel-endpoints/&quot;&gt;Configure tunnel endpoints&lt;/a&gt; for Magic Transit.&lt;/p&gt;</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><product>Cloudflare WAN</product><category>Cloudflare WAN</category><category>Magic Transit</category><category>Cloudflare One</category></item><item><title>Containers - SSH through Wrangler is now enabled by default for Containers</title><link>https://developers.cloudflare.com/changelog/post/2026-05-12-ssh-enabled-by-default/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-12-ssh-enabled-by-default/</guid><description>
&lt;p&gt;SSH through Wrangler is now enabled by default for &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt;. Previously, you had to set &lt;code&gt;ssh.enabled&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; in your Container configuration before you could connect.&lt;/p&gt;
&lt;p&gt;This change does not expose any publicly accessible ports on your Container. The SSH service is reachable only through &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/containers/#containers-ssh&quot;&gt;&lt;code&gt;wrangler containers ssh&lt;/code&gt;&lt;/a&gt;, which authenticates against your Cloudflare account. You also need to add an &lt;code&gt;ssh-ed25519&lt;/code&gt; public key to &lt;code&gt;authorized_keys&lt;/code&gt; before anyone can connect, so enabling SSH alone does not grant access.&lt;/p&gt;
&lt;p&gt;To connect, add a public key to your Container configuration and run &lt;code&gt;wrangler containers ssh &amp;lt;INSTANCE_ID&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;containers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;authorized_keys&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;NAME&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;public_key&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;YOUR_PUBLIC_KEY_HERE&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;authorized_keys&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;NAME&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;public_key = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;YOUR_PUBLIC_KEY_HERE&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;To disable SSH, set &lt;code&gt;ssh.enabled&lt;/code&gt; to &lt;code&gt;false&lt;/code&gt; in your Container configuration:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;containers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;ssh&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;				&quot;enabled&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;ssh&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;enabled = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;false&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/containers/ssh/&quot;&gt;SSH documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Gateway - Create Gateway firewall policies with natural language</title><link>https://developers.cloudflare.com/changelog/post/2026-05-12-natural-language-policy-creation/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-12-natural-language-policy-creation/</guid><description>&lt;p&gt;Cloudflare Gateway now supports natural language policy creation for &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/dns-policies/&quot;&gt;DNS&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/&quot;&gt;HTTP&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/&quot;&gt;Network&lt;/a&gt; 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2360,height=1088,format=webp/_astro/gateway-create-with-ai.BYG07coh.png&quot; alt=&quot;Create with AI button on the Gateway firewall policies page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2360&quot; height=&quot;1088&quot;&gt;
&lt;p&gt;To create a policy with natural language, select &lt;strong&gt;Create with AI&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot;&gt;Gateway firewall policies&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category></item><item><title>R2, R2 Data Catalog - R2 Data Catalog now exposes metrics via the GraphQL Analytics API</title><link>https://developers.cloudflare.com/changelog/post/2026-05-12-r2-data-catalog-graphql-analytics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-12-r2-data-catalog-graphql-analytics/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; is a managed Apache Iceberg data catalog built directly into your R2 bucket that allows you to connect query engines like &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt;, Spark, Snowflake, and DuckDB to your data in R2.&lt;/p&gt;
&lt;p&gt;You can now query analytics for your R2 Data Catalog warehouses via Cloudflare&apos;s &lt;a href=&quot;https://developers.cloudflare.com/analytics/graphql-api/&quot;&gt;GraphQL Analytics API&lt;/a&gt;. Two new datasets are available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;r2CatalogDataOperationsAdaptiveGroups&lt;/code&gt;&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;r2CatalogTableMaintenanceAdaptiveGroups&lt;/code&gt;&lt;/strong&gt; 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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both datasets support filtering by warehouse name, namespace, table name, and time range. They also include percentile aggregations for duration metrics.&lt;/p&gt;
&lt;p&gt;For detailed schema information and example queries, refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/observability/metrics/&quot;&gt;R2 Data Catalog metrics and analytics documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category><category>R2 Data Catalog</category></item><item><title>Security Center - Agent Readiness scores now available in URL Scanner via the Cloudflare Dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-05-12-URL-scanner-report-agent-readiness/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-12-URL-scanner-report-agent-readiness/</guid><description>&lt;p&gt;We’ve added a new &lt;strong&gt;Agent Readiness&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;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&apos;t &quot;agent-ready,&quot; these bots may consume excessive bandwidth, fail to find critical information, or be unable to navigate your services efficiently.&lt;/p&gt;
&lt;p&gt;This update provides material value by breaking down readiness into six actionable categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Basic Web Presence&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discoverability&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Accessibility&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bot Access Control&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Protocol Discovery&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Commerce&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;accessing-the-report&quot;&gt;Accessing the report&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#accessing-the-report&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can view these scores for any scanned URL directly in the dashboard or via our API.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dashboard:&lt;/strong&gt; Go to &lt;strong&gt;Protect &amp;amp; Connect &amp;gt; Application Security &amp;gt; Investigate&lt;/strong&gt;. After running a scan, select the &lt;strong&gt;Agent Readiness&lt;/strong&gt; tab in the report.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API:&lt;/strong&gt; Use the &lt;a href=&quot;https://developers.cloudflare.com/radar/investigate/url-scanner/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;URL Scanner API&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to programmatically retrieve these scores for your infrastructure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To learn more about the methodology behind these scores, refer to the &lt;a href=&quot;https://blog.cloudflare.com/agent-readiness/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;blogpost&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Cloudflare One Client - Cloudflare One Client for Windows (version 2026.4.1350.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-05-11-warp-windows-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-11-warp-windows-ga/</guid><description>&lt;p&gt;A new GA release for the Windows Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right click context menu to access the most common client actions quickly&lt;/li&gt;
&lt;li&gt;Built-in captive portal login experience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Additional Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added a new CLI command: warp-cli mdm refresh. This command executes an immediate refresh of the Mobile Device Management (MDM) configuration file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;An error indicating that Microsoft Edge can&amp;#39;t read and write to its data directory may be displayed during captive portal login; this error is benign and can be dismissed.&lt;/li&gt;
&lt;li&gt;Registration may hang at &amp;quot;Checking your organization configuration&amp;quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.&lt;/li&gt;
&lt;li&gt;Split tunnel list configuration is not available in the new UI. Management of Split Tunnel entries is currently only possible via &lt;code&gt;warp-cli tunnel ip&lt;/code&gt; and &lt;code&gt;warp-cli tunnel host&lt;/code&gt;. UI support will be added in a future release.&lt;/li&gt;
&lt;li&gt;Windows ARM may prompt the user to close running applications while trying to install this version. Simply click “Ok” with the default highlighted option.&lt;/li&gt;
&lt;li&gt;DNS resolution may be broken when the following conditions are all true:&lt;ul&gt;
&lt;li&gt;The client is in Secure Web Gateway without DNS filtering (tunnel-only) mode.&lt;/li&gt;
&lt;li&gt;A custom DNS server address is configured on the primary network adapter.&lt;/li&gt;
&lt;li&gt;The custom DNS server address on the primary network adapter is changed while the client is connected.&lt;br&gt;To work around this issue, please reconnect the client by selecting &amp;quot;disconnect&amp;quot; and then &amp;quot;connect&amp;quot; in the client user interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Mon, 11 May 2026 17:35:58 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - Cloudflare One Client for macOS (version 2026.4.1350.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-05-11-warp-macos-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-11-warp-macos-ga/</guid><description>&lt;p&gt;A new GA release for the macOS Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right click context menu to access the most common client actions quickly&lt;/li&gt;
&lt;li&gt;Built-in captive portal login experience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Additional Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added a new CLI command: warp-cli mdm refresh. This command executes an immediate refresh of the Mobile Device Management (MDM) configuration file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Registration may hang at &amp;quot;Checking your organization configuration&amp;quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.&lt;/li&gt;
&lt;li&gt;Split tunnel list configuration is not available in the new UI. Management of split tunnel entries is currently only possible via &lt;code&gt;warp-cli tunnel ip&lt;/code&gt; and &lt;code&gt;warp-cli tunnel host&lt;/code&gt;. UI support will be added in a future release.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Mon, 11 May 2026 17:35:57 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - Cloudflare One Client for Linux (version 2026.4.1350.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-05-11-warp-linux-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-11-warp-linux-ga/</guid><description>&lt;p&gt;A new GA release for the Linux Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right click context menu to access the most common client actions quickly&lt;/li&gt;
&lt;li&gt;Built-in captive portal login experience&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added a new CLI command: warp-cli mdm refresh. This command executes an immediate refresh of the Mobile Device Management (MDM) configuration file.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Registration may hang at &amp;quot;Checking your organization configuration&amp;quot; due to IPC errors. A system reboot should resolve the error, allowing registration to proceed.&lt;/li&gt;
&lt;li&gt;Split tunnel list configuration is not available in the new UI. Management of split tunnel entries is currently only possible via &lt;code&gt;warp-cli tunnel ip&lt;/code&gt; and &lt;code&gt;warp-cli tunnel host&lt;/code&gt;. UI support will be added in a future release.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Mon, 11 May 2026 15:17:54 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare WAN, Magic Transit - NAT-T support for IKE on UDP port 500</title><link>https://developers.cloudflare.com/changelog/post/2026-05-11-nat-t-port-500/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-11-nat-t-port-500/</guid><description>&lt;p&gt;Cloudflare IPsec now supports the standard NAT traversal (NAT-T) flow, where IKE begins on UDP port &lt;code&gt;500&lt;/code&gt; and switches to UDP port &lt;code&gt;4500&lt;/code&gt; after NAT is detected.&lt;/p&gt;
&lt;p&gt;Previously, devices behind NAT had to be configured to initiate IKE on UDP port &lt;code&gt;4500&lt;/code&gt; directly. Devices that started on UDP port &lt;code&gt;500&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;What changed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Devices behind NAT can now initiate IKE on either UDP port &lt;code&gt;500&lt;/code&gt; or UDP port &lt;code&gt;4500&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Devices that start IKE on UDP port &lt;code&gt;500&lt;/code&gt; and switch to UDP port &lt;code&gt;4500&lt;/code&gt; after NAT detection now complete the handshake successfully.&lt;/li&gt;
&lt;li&gt;No configuration change is required on Cloudflare. The change is available for all IPsec tunnels on Cloudflare WAN and Magic Transit.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This change does not affect existing tunnels:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tunnels using UDP port &lt;code&gt;500&lt;/code&gt; with no NAT detected continue to operate as before.&lt;/li&gt;
&lt;li&gt;Tunnels configured to start IKE on UDP port &lt;code&gt;4500&lt;/code&gt; continue to operate as before.&lt;/li&gt;
&lt;li&gt;NAT detection logic is unchanged.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For configuration details, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/reference/gre-ipsec-tunnels/&quot;&gt;GRE and IPsec tunnels&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate><product>Cloudflare WAN</product><category>Cloudflare WAN</category><category>Magic Transit</category></item><item><title>WAF - WAF Release - 2026-05-11</title><link>https://developers.cloudflare.com/changelog/post/2026-05-11-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-11-waf-release/</guid><description>
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Existing rule enhancements have been deployed to improve detection resilience against broad classes of web attacks and strengthen behavioral coverage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Continuous Rule Improvements&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;23ac4a9e53f94467ba470c9468b3c389&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...68b3c389&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Remote Code Execution - Java Deserialization - Body - Beta&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;Remote Code Execution - Java Deserialization&quot; (ID: &lt;rule-id id=&quot;36b0532eb3c941449afed2d3744305c4&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...744305c4&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;).&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers AI - Planned model deprecations on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2026-05-08-planned-model-deprecations/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-08-planned-model-deprecations/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;recommended-replacements&quot;&gt;Recommended replacements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#recommended-replacements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/glm-4.7-flash/&quot;&gt;&lt;code&gt;@cf/zai-org/glm-4.7-flash&lt;/code&gt;&lt;/a&gt; — fast multilingual model with multi-turn tool calling and coding capabilities.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/gemma-4-26b-a4b-it/&quot;&gt;&lt;code&gt;@cf/google/gemma-4-26b-a4b-it&lt;/code&gt;&lt;/a&gt; — efficient open model with vision and tool calling.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.6/&quot;&gt;&lt;code&gt;@cf/moonshotai/kimi-k2.6&lt;/code&gt;&lt;/a&gt; — capable tool-calling and vision model for agentic workloads and coding.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For pricing, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;Workers AI pricing page&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;kimi-k25&quot;&gt;Kimi K2.5&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#kimi-k25&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.6/&quot;&gt;&lt;code&gt;@cf/moonshotai/kimi-k2.6&lt;/code&gt;&lt;/a&gt; pricing and model capabilities prior to May 30, 2026 to ensure that the model suits your needs.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;models-deprecated-on-may-30-2026&quot;&gt;Models deprecated on May 30, 2026&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#models-deprecated-on-may-30-2026&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@cf/moonshotai/kimi-k2.5&lt;/code&gt; --&amp;gt; &lt;code&gt;@cf/moonshotai/kimi-k2.6&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@hf/meta-llama/meta-llama-3-8b-instruct&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-3-8b-instruct&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-3-8b-instruct-awq&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-3.1-8b-instruct&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-3.1-8b-instruct-awq&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-3.1-70b-instruct&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-2-7b-chat-int8&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-2-7b-chat-fp16&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/mistral/mistral-7b-instruct-v0.1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@hf/mistral/mistral-7b-instruct-v0.2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@hf/google/gemma-7b-it&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/google/gemma-3-12b-it&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@hf/nousresearch/hermes-2-pro-mistral-7b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/microsoft/phi-2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/defog/sqlcoder-7b-2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/unum/uform-gen2-qwen-500m&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/facebook/bart-large-cnn&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;variants-that-remain-active&quot;&gt;Variants that remain active&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#variants-that-remain-active&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;-fast&lt;/code&gt; and &lt;code&gt;-lora&lt;/code&gt; variants of models will remain active, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-3.3-70b-instruct-fp8-fast&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta/llama-3.1-8b-instruct-fast&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/google/gemma-7b-it-lora&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/google/gemma-2b-it-lora&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/mistral/mistral-7b-instruct-v0.2-lora&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cf/meta-llama/llama-2-7b-chat-hf-lora&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For the full list of available models, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/&quot;&gt;Workers AI model catalog&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 08 May 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workers, WAF - WAF and framework adapter mitigations for React and Next.js vulnerabilities</title><link>https://developers.cloudflare.com/changelog/post/2026-05-06-react-nextjs-vulnerabilities/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-06-react-nextjs-vulnerabilities/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We strongly recommend updating your application and its dependencies immediately.&lt;/strong&gt; Patched versions are available for React (&lt;code&gt;react-server-dom-webpack&lt;/code&gt;, &lt;code&gt;react-server-dom-parcel&lt;/code&gt;, and &lt;code&gt;react-server-dom-turbopack&lt;/code&gt; &lt;code&gt;19.0.6&lt;/code&gt;, &lt;code&gt;19.1.7&lt;/code&gt;, and &lt;code&gt;19.2.6&lt;/code&gt;) and Next.js (&lt;code&gt;15.5.16&lt;/code&gt; and &lt;code&gt;16.2.5&lt;/code&gt;).&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;waf-protections&quot;&gt;WAF protections&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#waf-protections&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Cloudflare WAF rules deployed in response to prior React Server Component CVEs (&lt;a href=&quot;https://github.com/facebook/react/security/advisories/GHSA-2m3v-v2m8-q956&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;CVE-2025-55184&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://github.com/facebook/react/security/advisories/GHSA-83fc-fqcc-2hmg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;CVE-2026-23864&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;) 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.&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ruleset&lt;/th&gt;
&lt;th&gt;Rule description&lt;/th&gt;
&lt;th&gt;Rule ID&lt;/th&gt;
&lt;th&gt;Default action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;
&lt;td&gt;React - DoS - &lt;a href=&quot;https://github.com/facebook/react/security/advisories/GHSA-2m3v-v2m8-q956&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;CVE-2025-55184&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;2694f1610c0b471393b21aef102ec699&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Block&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;
&lt;td&gt;React - DoS - &lt;a href=&quot;https://github.com/facebook/react/security/advisories/GHSA-83fc-fqcc-2hmg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;CVE-2026-23864&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;aaede80b4d414dc89c443cea61680354&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Block&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The existing rules detect the underlying attack patterns generically. As a result, they apply to the new &lt;a href=&quot;https://github.com/facebook/react/security/advisories/GHSA-rv78-f8rc-xrxh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;CVE-2026-23870&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; denial-of-service vulnerability in Server Components and the corresponding Next.js advisory &lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-8h8q-6873-q5fj&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-8h8q-6873-q5fj&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cloudflare is investigating whether WAF rules can be safely and effectively deployed for three of the high-severity advisories: &lt;a href=&quot;https://github.com/facebook/react/security/advisories/GHSA-rv78-f8rc-xrxh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;CVE-2026-23870&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; / &lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-8h8q-6873-q5fj&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-8h8q-6873-q5fj&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-267c-6grr-h53f&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-267c-6grr-h53f&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-mg66-mrh9-m8jx&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-mg66-mrh9-m8jx&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. 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 &lt;a href=&quot;https://developers.cloudflare.com/waf/change-log/changelog/&quot;&gt;WAF changelog&lt;/a&gt;. Because these vulnerabilities were shared with Cloudflare with minimal advance notice, we are still investigating what WAF mitigations are possible.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Customers on Pro, Business, or Enterprise plans should ensure that &lt;a href=&quot;https://developers.cloudflare.com/waf/get-started/#1-deploy-the-cloudflare-managed-ruleset&quot;&gt;Managed Rules are enabled&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;nextjs-adapters&quot;&gt;Next.js adapters&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#nextjs-adapters&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Vinext:&lt;/strong&gt; &lt;a href=&quot;https://github.com/cloudflare/vinext&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Vinext&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; is a Vite plugin that reimplements the Next.js API surface. Vinext&apos;s latest release is not vulnerable to any of the disclosed CVEs. Vinext&apos;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 &lt;code&gt;x-nextjs-data&lt;/code&gt; at request boundaries. As an extra layer of defense, we added a React &lt;code&gt;19.2.6&lt;/code&gt; or later requirement when running &lt;code&gt;vinext init&lt;/code&gt; (&lt;a href=&quot;https://github.com/cloudflare/vinext/pull/1118&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PR #1118&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/cloudflare/vinext/pull/1112&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PR #1112&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;) to prevent accidentally running a vulnerable version of React with Vinext.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenNext on Cloudflare:&lt;/strong&gt; 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 (&lt;a href=&quot;https://github.com/opennextjs/opennextjs-cloudflare/pull/1255&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;PR #1255&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;summary-of-disclosed-vulnerabilities&quot;&gt;Summary of disclosed vulnerabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#summary-of-disclosed-vulnerabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Advisory&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;WAF status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/facebook/react/security/advisories/GHSA-rv78-f8rc-xrxh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;CVE-2026-23870&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; / &lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-8h8q-6873-q5fj&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-8h8q-6873-q5fj&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Denial of service in Server Components&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;WAF rules in place:&lt;/strong&gt; &lt;code&gt;2694f1610c0b471393b21aef102ec699&lt;/code&gt;, &lt;code&gt;aaede80b4d414dc89c443cea61680354&lt;/code&gt;&lt;br&gt;Cloudflare is investigating additional managed WAF coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-267c-6grr-h53f&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-267c-6grr-h53f&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Middleware bypass via segment-prefetch routes&lt;/td&gt;
&lt;td&gt;Cloudflare is investigating if this can be safely and effectively mitigated by a managed WAF rule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-mg66-mrh9-m8jx&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-mg66-mrh9-m8jx&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Denial of service via connection exhaustion in Cache Components&lt;/td&gt;
&lt;td&gt;Cloudflare is investigating if this can be safely and effectively mitigated by a managed WAF rule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-492v-c6pp-mqqv&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-492v-c6pp-mqqv&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Middleware bypass via dynamic route parameter injection&lt;/td&gt;
&lt;td&gt;Not possible to safely enable a managed WAF rule without potentially breaking application behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-c4j6-fc7j-m34r&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-c4j6-fc7j-m34r&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;SSRF via WebSocket upgrades&lt;/td&gt;
&lt;td&gt;Not possible to safely enable a managed WAF rule without potentially breaking application behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-36qx-fr4f-26g5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-36qx-fr4f-26g5&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Middleware bypass in Pages Router i18n&lt;/td&gt;
&lt;td&gt;Custom WAF rule possible; global managed rule could potentially break application behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-ffhc-5mcf-pf4q&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-ffhc-5mcf-pf4q&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;XSS via CSP nonces&lt;/td&gt;
&lt;td&gt;Custom WAF rule possible; global managed rule could potentially break application behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-gx5p-jg67-6x7h&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-gx5p-jg67-6x7h&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;XSS in &lt;code&gt;beforeInteractive&lt;/code&gt; scripts&lt;/td&gt;
&lt;td&gt;Not possible to safely enable a managed WAF rule without potentially breaking application behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-h64f-5h5j-jqjh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-h64f-5h5j-jqjh&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Denial of service in Image Optimization API&lt;/td&gt;
&lt;td&gt;Custom WAF rule possible; global managed rule could potentially break application behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-wfc6-r584-vfw7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-wfc6-r584-vfw7&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;Cache poisoning in RSC responses&lt;/td&gt;
&lt;td&gt;Custom WAF rule possible; global managed rule could potentially break application behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-vfv6-92ff-j949&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-vfv6-92ff-j949&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Cache poisoning via RSC cache-busting collisions&lt;/td&gt;
&lt;td&gt;Not possible to safely enable a managed WAF rule without potentially breaking application behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/vercel/next.js/security/advisories/GHSA-3g8h-86w9-wvmq&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;GHSA-3g8h-86w9-wvmq&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Middleware redirect cache poisoning&lt;/td&gt;
&lt;td&gt;Custom WAF rule possible; global managed rule could potentially break application behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;</description><pubDate>Thu, 07 May 2026 12:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>WAF</category></item><item><title>Cloudflare One Appliance, Cloudflare One, Cloudflare WAN - Custom DHCP options on Cloudflare One Appliance</title><link>https://developers.cloudflare.com/changelog/post/2026-05-07-appliance-dhcp-options/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-07-appliance-dhcp-options/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Each option is defined by &lt;code&gt;option_number&lt;/code&gt;, &lt;code&gt;value&lt;/code&gt;, and one of four value types: &lt;code&gt;text&lt;/code&gt;, &lt;code&gt;integer&lt;/code&gt;, &lt;code&gt;hex&lt;/code&gt;, or &lt;code&gt;ip&lt;/code&gt;. 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.&lt;/p&gt;
&lt;p&gt;For details, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/network-options/dhcp/dhcp-options/&quot;&gt;DHCP server options&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><product>Cloudflare One Appliance</product><category>Cloudflare One Appliance</category><category>Cloudflare One</category><category>Cloudflare WAN</category></item><item><title>Cloudflare One Appliance, Cloudflare One, Cloudflare WAN - Source-based breakout and prioritization on Cloudflare One Appliance</title><link>https://developers.cloudflare.com/changelog/post/2026-05-07-appliance-source-based-breakout/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-07-appliance-source-based-breakout/</guid><description>&lt;p&gt;Breakout and traffic prioritization rules on the Cloudflare One Appliance can now match by &lt;strong&gt;source&lt;/strong&gt; in addition to destination application. You can pin breakout or priority behavior to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A source LAN interface — VLANs attached to that LAN are included automatically.&lt;/li&gt;
&lt;li&gt;A source IP address, range, or CIDR block.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For details, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/network-options/application-based-policies/breakout-traffic/#breakout-by-source&quot;&gt;Breakout traffic&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><product>Cloudflare One Appliance</product><category>Cloudflare One Appliance</category><category>Cloudflare One</category><category>Cloudflare WAN</category></item><item><title>Cloudflare One Appliance, Cloudflare One, Cloudflare WAN - Self-serve provisioning of Cloudflare One Virtual Appliance via API</title><link>https://developers.cloudflare.com/changelog/post/2026-05-07-virtual-appliance-self-serve-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-07-virtual-appliance-self-serve-api/</guid><description>&lt;p&gt;You can now create, rotate, and delete Cloudflare One Virtual Appliance instances and their license keys directly via the API and Terraform.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a virtual appliance and receive a license key: &lt;code&gt;POST /accounts/{account_id}/magic/connectors&lt;/code&gt; with &lt;code&gt;device.provision_license: true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Rotate the license key for an existing virtual appliance: &lt;code&gt;PATCH /accounts/{account_id}/magic/connectors/{connector_id}&lt;/code&gt; with &lt;code&gt;provision_license: true&lt;/code&gt;. The previous key is immediately and irrevocably revoked.&lt;/li&gt;
&lt;li&gt;Delete a virtual appliance to release the associated licensed device.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The license key is returned in the response only once, at create or rotate time. Copy and store it securely.&lt;/p&gt;
&lt;p&gt;For details, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/configure-virtual-appliance/&quot;&gt;Configure a Cloudflare One Virtual Appliance&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><product>Cloudflare One Appliance</product><category>Cloudflare One Appliance</category><category>Cloudflare One</category><category>Cloudflare WAN</category></item><item><title>Security Center - CSV export and adjustable page density for RFIs</title><link>https://developers.cloudflare.com/changelog/post/2026-05-07-CSV-export-for-RFIs/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-07-CSV-export-for-RFIs/</guid><description>&lt;p&gt;You can now export your Requests for Information (RFI) history to a &lt;strong&gt;CSV document&lt;/strong&gt; and customize your dashboard view by choosing how many RFI records to load per page.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;why-this-matters&quot;&gt;Why this matters&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#why-this-matters&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;These quality-of-life updates focus on data portability and dashboard performance, allowing power users to manage high volumes of requests more efficiently:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The new &lt;strong&gt;CSV export&lt;/strong&gt; 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&lt;/li&gt;
&lt;li&gt;With &lt;strong&gt;adjustable page density&lt;/strong&gt;, you can now choose to load more records at once (10, 25 or 50) to scan through history faster&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cloudforce One subscribers can find these new options in &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/application-security/threat-intelligence/requests&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Dashboard &amp;gt; Application Security &amp;gt; Threat Intelligence &amp;gt; Requests for Information&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Stream - Introducing Stream Bindings for Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-05-07-stream-workers-binding/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-07-stream-workers-binding/</guid><description>
&lt;p&gt;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&apos;re excited to bring Stream and Workers closer together to empower more programmatic pipelines, tighter integrations, and support generative AI and inference workloads.&lt;/p&gt;
&lt;p&gt;Use the Stream binding when you want to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Upload videos from URLs or create basic direct upload links for end users&lt;/li&gt;
&lt;li&gt;Generate signed playback tokens without managing signing keys&lt;/li&gt;
&lt;li&gt;Manage video metadata, captions, downloads, and watermarks&lt;/li&gt;
&lt;li&gt;Build video pipelines entirely within Workers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, add the Stream binding to your Wrangler configuration:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;stream&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;STREAM&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;stream&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;STREAM&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;&lt;strong&gt;Generate a video with AI and upload directly to Stream&lt;/strong&gt; or send a URL of a file you already have:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; aiResponse&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;google/veo-3.1&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		prompt: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;A dog walking next to a river&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		duration: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;10s&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		aspect_ratio: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;16:9&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		resolution: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;1080p&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		generate_audio: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		gateway: { id: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;experiments&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Veo will return a URL of the generated asset.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; videoUrl&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; aiResponse.result.video;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Alternative option: a video of the Austin Office mobile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// const videoUrl = &apos;https://pub-d9fcbc1abcd244c1821f38b99017347f.r2.dev/aus-mobile.mp4&apos;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Upload to Stream by providing a URL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; streamVideo&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;STREAM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;upload&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(videoUrl);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// The streamVideo response will include the video ID, playback and manifest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// URLs, and other information, just like the REST API.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; aiResponse&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&apos;google/veo-3.1&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		prompt: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;A dog walking next to a river&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		duration: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;10s&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		aspect_ratio: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;16:9&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		resolution: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;1080p&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		generate_audio: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		gateway: { id: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;experiments&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Veo will return a URL of the generated asset.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; videoUrl&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; aiResponse.result.video;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Alternative option: a video of the Austin Office mobile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// const videoUrl = &apos;https://pub-d9fcbc1abcd244c1821f38b99017347f.r2.dev/aus-mobile.mp4&apos;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Upload to Stream by providing a URL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; streamVideo&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;STREAM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;upload&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(videoUrl);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// The streamVideo response will include the video ID, playback and manifest&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// URLs, and other information, just like the REST API.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Generate a signed URL without using a signing key&lt;/strong&gt; or an API call:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; video_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ce800be43a9772f4bb02f35b860fb516&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; token&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;STREAM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(video_id).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;generateToken&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Use the &quot;token&quot; in an iframe embed code, manifest URL, or thumbnail:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; embedUrl&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; `https://customer-igynxd2rwhmuoxw8.cloudflarestream.com/${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;token&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}/iframe`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; video_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;ce800be43a9772f4bb02f35b860fb516&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; token&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;STREAM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(video_id).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;generateToken&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Use the &quot;token&quot; in an iframe embed code, manifest URL, or thumbnail:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; embedUrl&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; `https://customer-igynxd2rwhmuoxw8.cloudflarestream.com/${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;token&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}/iframe`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Get and set video properties&lt;/strong&gt; easily:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; video_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;46c8b7f480d410840758c1cb14a72e47&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;STREAM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(video_id).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;STREAM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(video_id).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	meta: { name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;sample video&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; video_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;46c8b7f480d410840758c1cb14a72e47&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;STREAM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(video_id).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;STREAM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;video&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(video_id).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  meta: { name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;sample video&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;For setup instructions and the full API reference, refer to &lt;a href=&quot;https://developers.cloudflare.com/stream/manage-video-library/bindings/&quot;&gt;Bind to Workers API&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started-with-your-agent&quot;&gt;Get started with your Agent&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started-with-your-agent&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/blockquote&gt;</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><product>Stream</product><category>Stream</category></item><item><title>WAF - WAF Release - 2026-05-07 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2026-05-07-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-07-emergency-waf-release/</guid><description>
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CVE-2026-44575: Next.js Middleware / Proxy Bypass in App Router Applications via Segment-Prefetch Routes&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;1de95bf6d6374e1099854278e77e4a53&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...e77e4a53&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Next.js - Middleware Bypass via Invalid RSC Header - CVE:CVE-2026-44575&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - Automatic tracing across Durable Object and Worker subrequests</title><link>https://developers.cloudflare.com/changelog/post/2026-05-07-automatic-tracing-across-do-and-worker-subrequests/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-07-automatic-tracing-across-do-and-worker-subrequests/</guid><description>&lt;p&gt;You can now get a single unified trace across Worker-to-Worker subrequests, with trace context propagating automatically. Previously, &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/traces/&quot;&gt;automatic tracing&lt;/a&gt; produced disconnected traces when a Worker called another Worker through a &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/&quot;&gt;service binding&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Object&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;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&quot; alt=&quot;Unified trace showing nested spans across a Durable Object subrequest and a service binding call&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1824&quot; height=&quot;1156&quot;&gt;
&lt;p&gt;This means you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Follow a request through your entire Worker architecture in one trace view&lt;/li&gt;
&lt;li&gt;See service binding and Durable Object calls as nested child spans instead of separate traces&lt;/li&gt;
&lt;li&gt;Debug cross-Worker request flows in the Cloudflare dashboard or in an external observability platform via &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/exporting-opentelemetry-data/&quot;&gt;OpenTelemetry&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/observability/traces/#how-to-enable-tracing&quot;&gt;Tracing must be enabled&lt;/a&gt; in your Wrangler configuration for traces to be recorded. Checkout &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/traces/&quot;&gt;Workers tracing&lt;/a&gt; to get started.&lt;/p&gt;
&lt;p&gt;Up next, we are working on external trace context propagation using &lt;a href=&quot;https://www.w3.org/TR/trace-context/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;W3C Trace Context standards&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, which will allow traces from your Workers to link with traces from services outside of Cloudflare.&lt;/p&gt;</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Email security - Cloudy Summaries in PhishNet O365</title><link>https://developers.cloudflare.com/changelog/post/2026-05-06-cloudy-summaries-in-phishnet_o365/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-06-cloudy-summaries-in-phishnet_o365/</guid><description>&lt;p&gt;PhishNet users can now access &lt;strong&gt;Cloudy summaries&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;These summaries are not trained on customer data.&lt;/strong&gt; They are generated using the outputs of our existing detection models and analysis systems.&lt;/p&gt;
&lt;p&gt;This feature is available for PhishNet with Office 365. Support for Gmail will be available by the end of the quarter.&lt;/p&gt;</description><pubDate>Wed, 06 May 2026 18:15:13 GMT</pubDate><product>Email security</product><category>Email security</category></item><item><title>Cloudflare One - IPv6 CIDR routes for Cloudflare Mesh</title><link>https://developers.cloudflare.com/changelog/post/2026-05-06-mesh-ipv6-routes/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-06-mesh-ipv6-routes/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;Cloudflare Mesh&lt;/a&gt; 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2906,height=1352,format=webp/_astro/mesh-ipv6-routes.CC-jlZkw.png&quot; alt=&quot;IPv6 CIDR routes on a Mesh node in the Cloudflare dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2906&quot; height=&quot;1352&quot;&gt;
&lt;p&gt;To add an IPv6 route, follow the same steps as &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#add-a-route&quot;&gt;adding an IPv4 route&lt;/a&gt; — enter the IPv6 CIDR (for example, &lt;code&gt;fd00::/64&lt;/code&gt;) when configuring the route in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/mesh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; or via the API.&lt;/p&gt;</description><pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category></item><item><title>Radar - TLD Nameserver Performance in Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-05-06-radar-tld-nameserver-performance/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-06-radar-tld-nameserver-performance/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; now provides TLD authoritative nameserver performance insights, measuring response time (latency) as observed from Cloudflare&apos;s &lt;a href=&quot;https://developers.cloudflare.com/1.1.1.1/&quot;&gt;1.1.1.1&lt;/a&gt; resolver infrastructure when forwarding queries upstream to TLD nameservers.&lt;/p&gt;
&lt;p&gt;New widgets on &lt;a href=&quot;https://radar.cloudflare.com/tlds/com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TLD detail pages&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://radar.cloudflare.com/tlds/com#tld-ns-latency&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Aggregate nameserver latency&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;: Response time percentiles (p25/p50/p75) for all authoritative nameservers of the selected TLD.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://radar.cloudflare.com/tlds/com#tld-ns-latency-by-ns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Latency per nameserver&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;: Median response time (p50) broken down by each authoritative nameserver over time.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1268,format=webp/_astro/tld-nameserver-latency-by-ns.CZGT23Vk.png&quot; alt=&quot;Latency per nameserver chart&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;1268&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://radar.cloudflare.com/tlds/com#geographical-distribution&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Median latency geographic distribution&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;: p50 response time by Cloudflare data center country, displayed on a choropleth map.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://radar.cloudflare.com/tlds/com#tld-ranking&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;TLD ranking over time&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;: Daily DNS magnitude rank and magnitude value with a Rank/Magnitude toggle.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://radar.cloudflare.com/tlds&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Rank change deltas&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;: 1 week, 4 weeks, and 3 months rank changes added to the TLD magnitude table and the TLD detail info panel.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2642,height=1446,format=webp/_astro/tld-magnitude-rank-deltas.BaT-jII_.webp&quot; alt=&quot;TLD Rankings by DNS Magnitude table with rank change deltas&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2642&quot; height=&quot;1446&quot;&gt;
&lt;p&gt;The new &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/tlds/subresources/performance/&quot;&gt;&lt;code&gt;TLD Performance&lt;/code&gt;&lt;/a&gt; API provides the following endpoints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/tlds/subresources/performance/methods/summary/&quot;&gt;&lt;code&gt;/tlds/performance/summary/{dimension}&lt;/code&gt;&lt;/a&gt; — TLD nameserver performance summarized by dimension.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/tlds/subresources/performance/methods/timeseries_groups/&quot;&gt;&lt;code&gt;/tlds/performance/timeseries_groups/{dimension}&lt;/code&gt;&lt;/a&gt; — TLD nameserver performance over time grouped by dimension.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Available dimensions: &lt;code&gt;LATENCY&lt;/code&gt; (aggregate p25/p50/p75), &lt;code&gt;NAMESERVER_LATENCY&lt;/code&gt; (per-nameserver p50), &lt;code&gt;LOCATION_LATENCY&lt;/code&gt; (per-data-center-country p50).&lt;/p&gt;
&lt;p&gt;TLD Performance is also available as a dataset in the &lt;a href=&quot;https://radar.cloudflare.com/explorer?dataSet=tlds.performance&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Data Explorer&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Check out the updated &lt;a href=&quot;https://radar.cloudflare.com/tlds/com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TLD detail page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Security Center - TAXII support added to Threat Events API</title><link>https://developers.cloudflare.com/changelog/post/2026-05-06-TAXII-support-for-threat-events-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-06-TAXII-support-for-threat-events-api/</guid><description>&lt;p&gt;The Cloudforce One Threat Events API now supports &lt;a href=&quot;https://www.cloudflare.com/en-gb/learning/security/what-is-stix-and-taxii/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;TAXII&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; as an output format, enabling standardized, automated sharing of cyber threat intelligence with your existing security stack.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;why-this-matters&quot;&gt;Why this matters&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#why-this-matters&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;This alignment with industry standards ensures that your threat data remains consistent across different security ecosystems and partner integrations.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;how-to-use-it&quot;&gt;How to use it&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#how-to-use-it&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When calling the Threat Events API, you can now specify &lt;code&gt;taxii&lt;/code&gt; in the &lt;code&gt;format&lt;/code&gt; query parameter:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GET /accounts/{account_id}/cloudforce_one/threat_events?format=taxii&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You can find the updated documentation in the &lt;a href=&quot;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&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare API Reference&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Cache - Pingora now powers Cloudflare&apos;s cache</title><link>https://developers.cloudflare.com/changelog/post/2026-05-04-pingora-powers-cache/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-04-pingora-powers-cache/</guid><description>&lt;p&gt;Cloudflare&apos;s cache now runs on a new proxy built on &lt;a href=&quot;https://github.com/cloudflare/pingora&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Pingora&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, the Rust-based framework that already serves a significant portion of Cloudflare&apos;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-this-brings&quot;&gt;What this brings&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-this-brings&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lower latency&lt;/strong&gt;: The new proxy reduces per-request overhead through improved connection reuse.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduced cache MISSes&lt;/strong&gt;: Enhanced cache retention improves origin offload.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better RFC compliance&lt;/strong&gt;: Caching behavior more closely follows HTTP caching standards.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Foundation for future features&lt;/strong&gt;: The new architecture enables upcoming improvements to cache functionality and efficiency.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-features&quot;&gt;New features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Asynchronous &lt;code&gt;stale-while-revalidate&lt;/code&gt;&lt;/strong&gt;: 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 &lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-02-26-async-stale-while-revalidate/&quot;&gt;asynchronous &lt;code&gt;stale-while-revalidate&lt;/code&gt; changelog&lt;/a&gt; for details.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unbuffered bypass by default&lt;/strong&gt;: Responses that bypass cache are streamed directly to the client without buffering, reducing time-to-first-byte for uncacheable content.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;behavioral-changes&quot;&gt;Behavioral changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#behavioral-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The new architecture introduces the following behavioral changes to improve RFC compliance and correctness:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Vary: *&lt;/code&gt; results in cache bypass&lt;/strong&gt;: According to &lt;a href=&quot;https://httpwg.org/specs/rfc9110.html#field.vary&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 9110 Section 12.5.5&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, a &lt;code&gt;Vary&lt;/code&gt; header value of &lt;code&gt;*&lt;/code&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Set-Cookie&lt;/code&gt; stripped on MISS and EXPIRED&lt;/strong&gt;: For cacheable assets, &lt;code&gt;Set-Cookie&lt;/code&gt; is now stripped on MISS and EXPIRED responses, not only on HITs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Floating-point TTL values&lt;/strong&gt;: Floating-point time-to-live values (for example, &lt;code&gt;max-age=1.5&lt;/code&gt;) are rounded down to the nearest integer instead of being rejected as invalid.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-next&quot;&gt;What&apos;s next&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-next&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A deeper look at the new cache proxy is coming soon to the &lt;a href=&quot;https://blog.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare blog&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. For background on the underlying framework, read:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.cloudflare.com/pingora-open-source/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Open sourcing Pingora: our Rust framework for building programmable network services&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.cloudflare.com/how-we-built-pingora-the-proxy-that-connects-cloudflare-to-the-internet/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;How we built Pingora, the proxy that connects Cloudflare to the Internet&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate><product>Cache</product><category>Cache</category></item><item><title>Cloudflare Fundamentals - Keyboard shortcuts for the Cloudflare dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-05-04-keyboard-shortcuts/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-04-keyboard-shortcuts/</guid><description>&lt;p&gt;You can now navigate, switch context, and take common actions in the Cloudflare dashboard without leaving your keyboard. Press &lt;code&gt;?&lt;/code&gt; anywhere to see the full list. Keyboard shortcuts can be disabled by visiting your &lt;a href=&quot;https://dash.cloudflare.com/profile/settings&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;profile settings&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;navigate&quot;&gt;Navigate&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#navigate&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;g h&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go to Home&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;g a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go to account overview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;g z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go to zone overview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;g p&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go to your profile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;g w&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go to Workers &amp;amp; Pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;g o&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go to Zero Trust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;g b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go to billing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;g 1&lt;/code&gt; – &lt;code&gt;g 5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Go to a recent or pinned item (by position in sidebar)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;t →&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Move to the next tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;t ←&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Move to the previous tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p →&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Move to the next page of a table&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p ←&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Move to the previous page of a table&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;take-action&quot;&gt;Take action&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#take-action&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shortcut&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open quick search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;?&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show keyboard shortcuts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Switch account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s z&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Switch zone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s .&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Star or unstar the current zone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;p .&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pin or unpin the current page&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;t s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Toggle the sidebar open or closed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;t m&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Expand or collapse all sidebar menus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;t a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Toggle Ask AI sidebar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;d .&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Toggle dark mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;c u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Copy the current URL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;c d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Copy a deep link URL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;</description><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Pipelines - Pipelines and R2 Data Catalog now supported in Terraform</title><link>https://developers.cloudflare.com/changelog/post/2026-04-27-terraform-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-27-terraform-support/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/pipelines/&quot;&gt;Cloudflare Pipelines&lt;/a&gt; ingests streaming data via &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Workers&lt;/a&gt; or HTTP endpoints, transforms it with SQL, and writes it to &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt; as Apache Iceberg tables. &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; manages those Iceberg tables, compaction, and compatibility with query engines like &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/config-examples/spark-scala/&quot;&gt;Spark&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/config-examples/duckdb/&quot;&gt;DuckDB&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can now create and manage both products using Terraform, supported in the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Terraform provider v5.19.0&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The new Terraform resources are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/r2_data_catalog&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_r2_data_catalog&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; — enable the data catalog on an R2 bucket&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/pipeline_stream&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_pipeline_stream&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; — create a stream that receives events via HTTP or Worker bindings&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/pipeline_sink&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_pipeline_sink&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; — create a sink that writes to R2 Data Catalog or R2&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/pipeline&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_pipeline&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; — create a pipeline with SQL connecting a stream to a sink&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is a minimal example that creates a stream, an R2 Data Catalog sink, and a pipeline:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;hcl&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;hcl&quot; data-nb-lang=&quot;hcl&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;cloudflare_pipeline_stream&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;my_stream&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  account_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;cloudflare_account_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;       =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;my_stream&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  format&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;     =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { type &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  schema&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    fields &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      name     &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;value&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      type     &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;json&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      required &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  http&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;           =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { enabled &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, authentication &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, cors &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {} }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  worker_binding&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { enabled &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;cloudflare_pipeline_sink&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;my_sink&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  account_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;cloudflare_account_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;       =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;my_sink&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  type&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;       =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;r2_data_catalog&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  format&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;     =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { type &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;parquet&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  schema&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;     =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { fields &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [] }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  config&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    account_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var.cloudflare_account_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    bucket     &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;my-pipeline-bucket&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    table_name &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;my_table&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    token      &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var.catalog_token&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;cloudflare_pipeline&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;my_pipeline&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  account_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;cloudflare_account_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;       =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;my_pipeline&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  sql&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;INSERT INTO &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;cloudflare_pipeline_sink&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;my_sink&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; SELECT * FROM &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;cloudflare_pipeline_stream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;my_stream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For a full end-to-end example that includes R2 bucket creation, data catalog setup, and scoped API token provisioning, refer to the &lt;a href=&quot;https://developers.cloudflare.com/pipelines/reference/terraform/&quot;&gt;Pipelines Terraform documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate><product>Pipelines</product><category>Pipelines</category></item><item><title>Radar - New routing widgets on Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-05-04-radar-routing-widgets/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-04-radar-routing-widgets/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; is expanding its &lt;a href=&quot;https://radar.cloudflare.com/routing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Routing section&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; with two new widgets that give a deeper view into how networks announce address space and how RPKI ROA coverage evolves over time.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;top-ases-by-announced-ip-space-on-country-pages&quot;&gt;Top ASes by announced IP space on country pages&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#top-ases-by-announced-ip-space-on-country-pages&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Country routing pages now include a &lt;strong&gt;Top ASes by announced IP space&lt;/strong&gt; 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 &lt;strong&gt;Other&lt;/strong&gt;.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1322,format=webp/_astro/country-top-ases-ip-space.CoGqJB6W.png&quot; alt=&quot;Screenshot of the top ASes by announced IP space chart on a country routing page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;1322&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;rpki-roa-deployment-timeseries&quot;&gt;RPKI ROA deployment timeseries&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#rpki-roa-deployment-timeseries&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://radar.cloudflare.com/routing/rpki&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RPKI sub-page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; adds an &lt;strong&gt;RPKI ROA deployment&lt;/strong&gt; 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 &lt;strong&gt;prefixes&lt;/strong&gt; and the share of covered &lt;strong&gt;IP address space&lt;/strong&gt;. The widget is available on global, country, and AS views, so operators can monitor RPKI adoption progress and compare deployment trends across different scopes.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=874,format=webp/_astro/rpki-roa-deployment-timeseries.DTsP_V93.png&quot; alt=&quot;Screenshot of the RPKI ROA deployment timeseries widget&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;874&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;api-endpoints&quot;&gt;API endpoints&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#api-endpoints&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The data behind these widgets is also available through two new endpoints on the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/bgp/&quot;&gt;&lt;code&gt;BGP&lt;/code&gt;&lt;/a&gt; API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/ips/subresources/top/methods/ases/&quot;&gt;&lt;code&gt;/bgp/ips/top/ases&lt;/code&gt;&lt;/a&gt; - Returns the top autonomous systems by announced IP space (IPv4 &lt;code&gt;/24&lt;/code&gt;s or IPv6 &lt;code&gt;/48&lt;/code&gt;s), globally or filtered by country, snapped to the nearest 8-hour RIB boundary.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/rpki/subresources/roas/methods/timeseries/&quot;&gt;&lt;code&gt;/bgp/rpki/roas/timeseries&lt;/code&gt;&lt;/a&gt; - 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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Visit the &lt;a href=&quot;https://radar.cloudflare.com/routing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Radar routing section&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to explore both widgets.&lt;/p&gt;</description><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>WAF - WAF Release - 2026-05-04</title><link>https://developers.cloudflare.com/changelog/post/2026-05-04-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-04-waf-release/</guid><description>
&lt;p&gt;This week&apos;s release focuses on new detections to expand coverage across command injection, SQL injection, PHP object injection, remote code execution, and XSS attack vectors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Existing rule enhancements have been deployed to improve detection resilience against broad classes of web attacks and strengthen behavioral coverage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Continuous Rule Improvements&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;607ec27233b54beb8b89386ef0884a68&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...f0884a68&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XSS, HTML Injection - Object Tag - Body (beta)&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;XSS, HTML Injection - Object Tag&quot; (ID: &lt;rule-id id=&quot;e9e3ac45a6d842f1a132fbf70c14e284&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...0c14e284&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;).&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;0087c27420c54168a10bc05eff012303&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ff012303&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XSS, HTML Injection - Object Tag - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. The rule previously known as &quot;XSS, HTML
Injection - Object Tag - Headers (beta)&quot; is now renamed to &quot;XSS, HTML
Injection - Object Tag - Headers&quot;.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;38dc97853ebf40ed9476ec7816f921d9&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...16f921d9&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XSS, HTML Injection - Object Tag - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. The rule previously known as &quot;XSS, HTML
Injection - Object Tag - URI (beta)&quot; is now renamed to &quot;XSS, HTML
Injection - Object Tag - URI&quot;.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;963cb530f72d4c75b2ae7befdc90d21a&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...dc90d21a&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Command Injection - Generic 9 - Body Vector - Beta&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;Command Injection - Generic 9 - Body Vector&quot; (ID: &lt;rule-id id=&quot;155bb67d1061479e995a38510677175f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...0677175f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;6ac1b6dfe22449a798cc7021f8960375&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...f8960375&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Command Injection - Generic 9 - Header Vector - Beta&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;Command Injection - Generic 9 - Header Vector&quot; (ID: &lt;rule-id id=&quot;b31c34a7b29b4aaf9be6883d1eb7a999&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1eb7a999&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;47a9b66dd73a4a558590c4bdef47a800&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ef47a800&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Command Injection - Generic 9 - URI Vector - Beta&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;Command Injection - Generic 9 - URI Vector&quot; (ID: &lt;rule-id id=&quot;54ad0465c30d4cd2ac7a707197321c6c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...97321c6c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;d2ae4a8093f245a1b9de71bbbeebf804&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...beebf804&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Command Injection - Sleep - Body&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. The rule previously known as &quot;Command Injection&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Sleep&quot; is now renamed to &quot;Command Injection - Sleep - Body&quot;.&lt;/li&gt;
&lt;/ul&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;da91868c0d3d44afb846e7830d257566&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...0d257566&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Command Injection - Sleep - Headers&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;04863c61e982464b91778f051856fe86&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1856fe86&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Command Injection - Sleep - URI&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;9dc1a0b8dbb7425db619309be6e43c37&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...e6e43c37&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Fortinet FortiSandbox - Command Injection - CVE:CVE-2026-39808&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;b84c10f5a8f84800905932dc88118795&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...88118795&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Remote Code Execution - Common Bash Bypass - Headers&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;f496c40011f14bfdb5f55ec79299d53b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...9299d53b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Remote Code Execution - Common Bash Bypass - URI&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;a5f75abac2664554a984d061b0bf33f9&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...b0bf33f9&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Remote Code Execution - Common Bash Bypass - Body - Beta&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;Remote Code Execution - Common Bash Bypass Body&quot; (ID: &lt;rule-id id=&quot;6e2f7a696ea74c979e7d069cefb7e5b9&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...efb7e5b9&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;). The rule previously
known as &quot;Remote Code Execution - Common Bash Bypass Beta&quot; is now
renamed to &quot;Remote Code Execution - Common Bash Bypass Body&quot;.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;bbb31a886ab54f6c8cdd220d33bfe8b9&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...33bfe8b9&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;PHP Object Injection - 2 - Body - Beta&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;PHP Object Injection - 2&quot; (ID: &lt;rule-id id=&quot;8ef3c3f91eef46919cc9cb6d161aafdc&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...161aafdc&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;e199688ab69746c88c33457f29552387&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...29552387&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;PHP Object Injection - 2 - Headers&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;eb33d40e96c54e929af6ed9c8104f4c5&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8104f4c5&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;PHP Object Injection - 2 - URI&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;76b15b7b122a4be6a40d8aa96a46201e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...6a46201e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - DROP - 2 - Beta&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;SQLi - DROP - 2&quot; (ID: &lt;rule-id id=&quot;a967a167874b42b6898be46e48ac2221&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...48ac2221&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;e24b2ef4a5c54f97a62db7a68b7f85ee&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8b7f85ee&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - DROP - 2 - Headers&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;51123f35f1d249358aea8fb11546b5f0&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1546b5f0&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - DROP - 2 - URI&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;d86d8873310d41f2877458a91e053dce&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1e053dce&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SmarterMail - Remote Code Execution - CVE:CVE-2026-24423&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;00da180570d34b5bae2121acd0023a36&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d0023a36&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - SELECT Expression - Body&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;Action changed&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;c46d9097c9ef419aa4d9f10626cc211f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...26cc211f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - String Concatenation - URI&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;Action changed&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workflows, Workers - Run Workflows inside Dynamic Workers with the @cloudflare/dynamic-workflows library</title><link>https://developers.cloudflare.com/changelog/post/2026-05-01-dynamic-workflows/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-05-01-dynamic-workflows/</guid><description>&lt;p&gt;You can now use &lt;a href=&quot;https://github.com/cloudflare/dynamic-workflows&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@cloudflare/dynamic-workflows&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to run a &lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflow&lt;/a&gt; inside a &lt;a href=&quot;https://developers.cloudflare.com/dynamic-workers/&quot;&gt;Dynamic Worker&lt;/a&gt;, ensuring durable execution for code that is loaded at runtime.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;This unlocks patterns where the Workflow code itself is dynamic. For example, this is useful with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SaaS platforms&lt;/strong&gt; where each tenant defines their own automation, such as onboarding sequences, approval chains, or billing retry logic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI agent frameworks&lt;/strong&gt; where agents generate and execute multi-step plans at runtime, surviving restarts and waiting for human approval between tool calls.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-tenant job systems&lt;/strong&gt; where each customer submits their own processing logic and every step persists progress and retries on failure.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	createDynamicWorkflowEntrypoint,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	DynamicWorkflowBinding,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	wrapWorkflowBinding,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; WorkflowRunner,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/dynamic-workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { DynamicWorkflowBinding };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;interface&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	WORKFLOWS&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Workflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkerLoader&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; loadTenant&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;tenantId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(tenantId, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		compatibilityDate: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-01-01&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		mainModule: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;index.js&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		modules: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;index.js&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetchTenantCode&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(tenantId) },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// The Dynamic Worker uses this exactly like a real Workflow binding;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// every create() is tagged with { tenantId } automatically.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		env: { WORKFLOWS: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrapWorkflowBinding&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ tenantId }) },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// The entrypoint name must match `class_name` in the workflows binding of your Wrangler config file.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; DynamicWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createDynamicWorkflowEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;metadata&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stub&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; loadTenant&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env, metadata.tenantId &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stub.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;TenantWorkflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; unknown&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; as&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowRunner&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tenantId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; request.headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;x-tenant-id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; loadTenant&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env, tenantId).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For a full walkthrough, refer to the &lt;a href=&quot;https://developers.cloudflare.com/dynamic-workers/usage/dynamic-workflows/&quot;&gt;Dynamic Workflows guide&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Cloudflare One, Cloudflare WAN - Post-quantum IPsec interoperability with third-party devices</title><link>https://developers.cloudflare.com/changelog/post/2026-04-30-ipsec-post-quantum-third-party/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-30-ipsec-post-quantum-third-party/</guid><description>&lt;p&gt;Cloudflare IPsec now supports post-quantum key agreement with compatible third-party devices. &lt;a href=&quot;https://www.cisco.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cisco&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://www.fortinet.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Fortinet&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; are the first third-party vendors validated to interoperate with Cloudflare IPsec using ML-KEM (Module-Lattice-Based Key-Encapsulation Mechanism).&lt;/p&gt;
&lt;p&gt;Post-quantum IPsec uses &lt;a href=&quot;https://datatracker.ietf.org/doc/rfc9370/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 9370&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://datatracker.ietf.org/doc/draft-ietf-ipsecme-ikev2-mlkem/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;draft-ietf-ipsecme-ikev2-mlkem&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to negotiate hybrid key agreement during the IKEv2 &lt;code&gt;IKE_INTERMEDIATE&lt;/code&gt; phase. This combines classical Diffie-Hellman (Group 20) with ML-KEM-768 or ML-KEM-1024 to protect against &lt;a href=&quot;https://en.wikipedia.org/wiki/Harvest_now,_decrypt_later&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;harvest-now, decrypt-later&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; attacks.&lt;/p&gt;
&lt;p&gt;Key details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Compatible with Cisco 8000 Series Secure Routers with IOS XR Release 26.1.1 and Fortinet FortiOS 7.6.6 and later.&lt;/li&gt;
&lt;li&gt;Uses ML-KEM-768 or ML-KEM-1024 as an additional Key Exchange to DH Group 20.&lt;/li&gt;
&lt;li&gt;Follows RFC 9370 and draft-ietf-ipsecme-ikev2-mlkem standards.&lt;/li&gt;
&lt;li&gt;No additional licensing required.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For supported key exchange methods and the list of validated platforms, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/reference/gre-ipsec-tunnels/#tested-third-party-vendor-interoperability&quot;&gt;GRE and IPsec tunnels&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category><category>Cloudflare WAN</category></item><item><title>Data Loss Prevention - Classify sensitive content with Data Classification</title><link>https://developers.cloudflare.com/changelog/post/2026-04-30-data-classification/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-30-data-classification/</guid><description>&lt;p&gt;Cloudflare DLP now includes &lt;strong&gt;Data Classification&lt;/strong&gt;, which lets administrators organize and label sensitive content using labels, templates, and reusable data classes.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/data-classification/&quot;&gt;Data Classification&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><product>Data Loss Prevention</product><category>Data Loss Prevention</category></item><item><title>Data Loss Prevention - New predefined detection entries are available</title><link>https://developers.cloudflare.com/changelog/post/2026-04-30-standalone-predefined-detection-entries/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-30-standalone-predefined-detection-entries/</guid><description>&lt;p&gt;Cloudflare DLP now includes new predefined detection entries.&lt;/p&gt;
&lt;p&gt;The expanded catalog includes detections for specific credential types, webhooks, addresses, tax identifiers, national IDs, financial data, and crypto wallets.&lt;/p&gt;
&lt;p&gt;Examples include &lt;code&gt;GitHub PAT&lt;/code&gt;, &lt;code&gt;OpenAI API Key&lt;/code&gt;, &lt;code&gt;Slack Webhook&lt;/code&gt;, &lt;code&gt;Discord Webhook&lt;/code&gt;, &lt;code&gt;US Physical Address&lt;/code&gt;, and &lt;code&gt;Bitcoin Wallet&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For the full list, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/detection-entries/predefined-detection-entries/&quot;&gt;Predefined detection entries&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><product>Data Loss Prevention</product><category>Data Loss Prevention</category></item><item><title>SDK, Go SDK - Go SDK v7.0.0 Released</title><link>https://developers.cloudflare.com/changelog/post/2026-04-30-go-sdk-v7.0.0/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-30-go-sdk-v7.0.0/</guid><description>&lt;p&gt;Full Changelog: &lt;a href=&quot;https://github.com/cloudflare/cloudflare-go/compare/v6.10.0...v7.0.0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v6.10.0...v7.0.0&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a major version release that includes breaking changes to three packages: &lt;code&gt;ai_search&lt;/code&gt;, &lt;code&gt;email_security&lt;/code&gt;, and &lt;code&gt;workers&lt;/code&gt;. These changes reflect upstream API specification updates that improve type correctness and consistency.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Please ensure you read through the list of changes below before moving to this version&lt;/strong&gt; - this will help you understand any down or upstream issues it may cause to your environments.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;breaking-changes&quot;&gt;Breaking Changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#breaking-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;See the &lt;a href=&quot;https://github.com/cloudflare/cloudflare-go/blob/main/docs/migration-guides/v7.0.0-migration-guide.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v7.0.0 Migration Guide&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; for before/after code examples and actions needed for each change.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ai-search---searchforagents-metadata-removed&quot;&gt;AI Search - SearchForAgents Metadata Removed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ai-search---searchforagents-metadata-removed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;SearchForAgents&lt;/code&gt; nested type has been removed from all instance metadata structs. This field is no longer part of the API specification.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Removed Types:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;InstanceNewResponseMetadataSearchForAgents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InstanceUpdateResponseMetadataSearchForAgents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InstanceListResponseMetadataSearchForAgents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InstanceDeleteResponseMetadataSearchForAgents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InstanceReadResponseMetadataSearchForAgents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InstanceNewParamsMetadataSearchForAgents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InstanceUpdateParamsMetadataSearchForAgents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NamespaceInstanceNewResponseMetadataSearchForAgents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NamespaceInstanceUpdateResponseMetadataSearchForAgents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NamespaceInstanceListResponseMetadataSearchForAgents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NamespaceInstanceDeleteResponseMetadataSearchForAgents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NamespaceInstanceReadResponseMetadataSearchForAgents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NamespaceInstanceNewParamsMetadataSearchForAgents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NamespaceInstanceUpdateParamsMetadataSearchForAgents&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;email-security---path-parameter-type-changes&quot;&gt;Email Security - Path Parameter Type Changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#email-security---path-parameter-type-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Multiple Email Security settings sub-resources have changed their path parameter types from &lt;code&gt;int64&lt;/code&gt; to &lt;code&gt;string&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AllowPolicies&lt;/code&gt; (&lt;code&gt;policyID int64&lt;/code&gt; -&amp;gt; &lt;code&gt;policyID string&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BlockSenders&lt;/code&gt; (&lt;code&gt;patternID int64&lt;/code&gt; -&amp;gt; &lt;code&gt;patternID string&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Domains&lt;/code&gt; (&lt;code&gt;domainID int64&lt;/code&gt; -&amp;gt; &lt;code&gt;domainID string&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ImpersonationRegistry&lt;/code&gt; (&lt;code&gt;displayNameID int64&lt;/code&gt; -&amp;gt; &lt;code&gt;impersonationRegistryID string&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TrustedDomains&lt;/code&gt; (&lt;code&gt;trustedDomainID int64&lt;/code&gt; -&amp;gt; &lt;code&gt;trustedDomainID string&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;email-security---investigate-parameter-rename&quot;&gt;Email Security - Investigate Parameter Rename&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#email-security---investigate-parameter-rename&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;Investigate.Get&lt;/code&gt;, &lt;code&gt;Investigate.Move.New&lt;/code&gt;, and &lt;code&gt;Investigate.Reclassify.New&lt;/code&gt; methods now use &lt;code&gt;investigateID&lt;/code&gt; instead of &lt;code&gt;postfixID&lt;/code&gt; as the path parameter name.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;email-security---domains-bulkdelete-method-removed&quot;&gt;Email Security - Domains BulkDelete Method Removed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#email-security---domains-bulkdelete-method-removed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;SettingDomainService.BulkDelete&lt;/code&gt; method and its associated types have been removed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SettingDomainBulkDeleteResponse&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SettingDomainBulkDeleteParams&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;email-security---trusteddomains-return-type-change&quot;&gt;Email Security - TrustedDomains Return Type Change&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#email-security---trusteddomains-return-type-change&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;SettingTrustedDomainService.New&lt;/code&gt; now returns &lt;code&gt;*SettingTrustedDomainNewResponse&lt;/code&gt; instead of &lt;code&gt;*SettingTrustedDomainNewResponseUnion&lt;/code&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;email-security---investigatemove-return-type-change&quot;&gt;Email Security - Investigate.Move Return Type Change&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#email-security---investigatemove-return-type-change&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;InvestigateMoveService.New&lt;/code&gt; now returns &lt;code&gt;*pagination.SinglePage[InvestigateMoveNewResponse]&lt;/code&gt; instead of &lt;code&gt;*[]InvestigateMoveNewResponse&lt;/code&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;workers---observability-telemetry-filter-restructuring&quot;&gt;Workers - Observability Telemetry Filter Restructuring&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#workers---observability-telemetry-filter-restructuring&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The observability telemetry filter parameter types have been restructured to support nested filter groups. New discriminated union types replace the previous flat filter arrays:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ObservabilityTelemetryKeysParams.Filters&lt;/code&gt; now accepts &lt;code&gt;FiltersObjectFilterUnion&lt;/code&gt; (was &lt;code&gt;[]interface\{\}&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ObservabilityTelemetryQueryParams.Parameters.Filters&lt;/code&gt; now accepts &lt;code&gt;FiltersObjectFilterUnion&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ObservabilityTelemetryValuesParams.Filters&lt;/code&gt; now accepts &lt;code&gt;FiltersObjectFilterUnion&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;New types include &lt;code&gt;FiltersObjectFiltersObject&lt;/code&gt; (for group filters with &lt;code&gt;FilterCombination&lt;/code&gt;) and &lt;code&gt;FiltersWorkersObservabilityFilterLeaf&lt;/code&gt; (for leaf filters with typed &lt;code&gt;Operation&lt;/code&gt;, &lt;code&gt;Type&lt;/code&gt;, and &lt;code&gt;Value&lt;/code&gt; fields).&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;features&quot;&gt;Features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;organizations---audit-logs-clientorganizationslogsaudit&quot;&gt;Organizations - Audit Logs (&lt;code&gt;client.Organizations.Logs.Audit&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#organizations---audit-logs-clientorganizationslogsaudit&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;NEW SERVICE:&lt;/strong&gt; Query organization audit logs with cursor-based pagination.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;List()&lt;/code&gt; - Retrieve audit logs&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;browser-rendering-clientbrowserrendering&quot;&gt;Browser Rendering (&lt;code&gt;client.BrowserRendering&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#browser-rendering-clientbrowserrendering&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;client.BrowserRendering.Devtools.Browser.Targets.Close()&lt;/code&gt; - Close a specific browser target (tab, page) by ID&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;queues-clientqueues&quot;&gt;Queues (&lt;code&gt;client.Queues&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#queues-clientqueues&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;client.Queues.GetMetrics()&lt;/code&gt; - Retrieve queue metrics for a specific queue&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ai-search-clientaisearch&quot;&gt;AI Search (&lt;code&gt;client.AISearch&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ai-search-clientaisearch&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Added &lt;code&gt;WaitForCompletion&lt;/code&gt; parameter to &lt;code&gt;NamespaceInstanceItemNewOrUpdateParams&lt;/code&gt; and &lt;code&gt;NamespaceInstanceItemSyncParams&lt;/code&gt; for synchronous indexing confirmation&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;bug-fixes&quot;&gt;Bug Fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bug-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Magic Transit&lt;/strong&gt;: &lt;code&gt;ConnectorService.List&lt;/code&gt; parameter name corrected from &lt;code&gt;query&lt;/code&gt; to &lt;code&gt;params&lt;/code&gt; (non-functional, affects generated documentation only)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;deprecations&quot;&gt;Deprecations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#deprecations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;None in this release.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/cloudflare-go/releases/tag/v7.0.0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Download Go SDK v7.0.0&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/sdks/go/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Go SDK documentation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/cloudflare-go/blob/main/docs/migration-guides/v7.0.0-migration-guide.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Migration Guide&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><product>SDK</product><category>SDK</category><category>Go SDK</category></item><item><title>R2 - Empty buckets and delete folders from the R2 dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-04-30-r2-empty-bucket-folder-delete/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-30-r2-empty-bucket-folder-delete/</guid><description>&lt;p&gt;You can now empty an entire &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt; bucket or delete folders directly from the dashboard. Emptying a bucket is required before you can delete it. Previously, this required scripting or configuring &lt;a href=&quot;https://developers.cloudflare.com/r2/buckets/object-lifecycles/&quot;&gt;lifecycle rules&lt;/a&gt;. Now, the dashboard can handle it in a single action.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;empty-a-bucket&quot;&gt;Empty a bucket&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#empty-a-bucket&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Go to your bucket&apos;s &lt;strong&gt;Settings&lt;/strong&gt; tab and select &lt;strong&gt;Empty&lt;/strong&gt; under the &lt;strong&gt;Empty Bucket&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;Emptying a bucket is also a prerequisite for deleting it. The dashboard now guides you through both steps in one place.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3380,height=1776,format=webp/_astro/empty-bucket-changelog.DjuMZppm.png&quot; alt=&quot;Empty Bucket and Delete Bucket sections in the R2 dashboard Settings tab&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3380&quot; height=&quot;1776&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;delete-folders&quot;&gt;Delete folders&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#delete-folders&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;R2 uses a flat object structure. The dashboard groups objects that share a common prefix into folders when the &lt;strong&gt;View prefixes as directories&lt;/strong&gt; checkbox is selected. Deleting a folder removes every object under that prefix.&lt;/p&gt;
&lt;p&gt;From the &lt;strong&gt;Objects&lt;/strong&gt; tab, you can select one or more folders and delete them alongside individual objects.&lt;/p&gt;
&lt;p&gt;For step-by-step instructions, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2/buckets/delete-buckets/&quot;&gt;Delete buckets&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/r2/objects/delete-objects/&quot;&gt;Delete objects&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>Radar - Cloud Observatory connection metrics improvements</title><link>https://developers.cloudflare.com/changelog/post/2026-04-30-radar-cloud-observatory-connection-metrics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-30-radar-cloud-observatory-connection-metrics/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://radar.cloudflare.com/cloud-observatory&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloud Observatory&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; on &lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://radar.cloudflare.com/cloud-observatory#connection-metrics&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloud Observatory overview&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2338,height=1408,format=webp/_astro/cloud-observatory-connection-metrics-by-provider.Bk9nSitV.png&quot; alt=&quot;Screenshot of Cloud Observatory connection metrics broken down by cloud provider&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2338&quot; height=&quot;1408&quot;&gt;
&lt;p&gt;Each &lt;a href=&quot;https://radar.cloudflare.com/cloud-observatory/amazon#connection-metrics&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;provider page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; now shows connection metrics for the top five regions, with a selector to rank by lowest or highest values.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2338,height=1414,format=webp/_astro/cloud-observatory-connection-metrics-by-region.CbHAKXoc.png&quot; alt=&quot;Screenshot of Cloud Observatory connection metrics broken down by region for a provider&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2338&quot; height=&quot;1414&quot;&gt;
&lt;p&gt;Each &lt;a href=&quot;https://radar.cloudflare.com/cloud-observatory/amazon/us-east-1#connection-metrics&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;region page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; now displays connection metrics as percentile distributions (25th percentile, median, and 75th percentile), providing insight into the range and variability of connection times.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2340,height=1288,format=webp/_astro/cloud-observatory-connection-metrics-percentiles.DJ9eAE0-.png&quot; alt=&quot;Screenshot of Cloud Observatory connection metrics with percentile distribution for a region&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2340&quot; height=&quot;1288&quot;&gt;
&lt;p&gt;These views are also available through the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/origins/&quot;&gt;&lt;code&gt;Origins&lt;/code&gt; API&lt;/a&gt;, using the &lt;code&gt;timeseries_groups&lt;/code&gt; endpoint with the &lt;code&gt;ORIGIN&lt;/code&gt;, &lt;code&gt;REGION&lt;/code&gt;, or &lt;code&gt;PERCENTILE&lt;/code&gt; dimension.&lt;/p&gt;</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Radar - Dark mode support on Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-04-30-radar-dark-mode/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-30-radar-dark-mode/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; now supports &lt;strong&gt;dark mode&lt;/strong&gt;. A theme selector in the upper right corner of the page lets users explicitly choose between three display options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Light&lt;/strong&gt; — standard light theme&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dark&lt;/strong&gt; — full dark theme&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System&lt;/strong&gt; — follows the operating system preference&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=404,height=296,format=webp/_astro/dark-mode-theme-selector.D5ih8e4q.png&quot; alt=&quot;Screenshot of the theme selector showing Light, Dark, and System options&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;404&quot; height=&quot;296&quot;&gt;
&lt;p&gt;The selected theme applies consistently across all Radar pages and widgets.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3818,height=1682,format=webp/_astro/dark-mode-overview.D-39RJlY.png&quot; alt=&quot;Screenshot of the Cloudflare Radar overview page in dark mode&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3818&quot; height=&quot;1682&quot;&gt;
&lt;p&gt;The theme choice also applies to shared and embedded graphs.&lt;/p&gt;
&lt;p&gt;Try it out at &lt;a href=&quot;https://radar.cloudflare.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Radar&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>SDK - Cloudflare Python SDK v5.0.0 Released</title><link>https://developers.cloudflare.com/changelog/post/2026-04-30-cloudflare-python-v5.0.0/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-30-cloudflare-python-v5.0.0/</guid><description>&lt;p&gt;Full Changelog: &lt;a href=&quot;https://github.com/cloudflare/cloudflare-python/compare/v4.3.1...v5.0.0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v4.3.1...v5.0.0&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Please review the breaking changes below before upgrading.&lt;/strong&gt; A migration guide is available at &lt;a href=&quot;https://github.com/cloudflare/cloudflare-python/blob/main/docs/migration-guides/v5.0.0-migration-guide.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v5.0.0 Migration Guide&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;breaking-changes&quot;&gt;Breaking Changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#breaking-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python 3.8 is no longer supported.&lt;/strong&gt; The minimum required version is now Python 3.9.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;typing-extensions&lt;/code&gt; minimum version bumped&lt;/strong&gt; from &lt;code&gt;&amp;gt;=4.10&lt;/code&gt; to &lt;code&gt;&amp;gt;=4.14&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following resources have breaking changes. See the &lt;a href=&quot;https://github.com/cloudflare/cloudflare-python/blob/main/docs/migration-guides/v5.0.0-migration-guide.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v5.0.0 Migration Guide&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; for detailed migration instructions.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;abusereports&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;acm.totaltls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;apigateway.configurations&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cloudforceone.threatevents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;d1.database&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;intel.indicatorfeeds&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;logpush.edge&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;origintlsclientauth.hostnames&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;queues.consumers&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;radar.bgp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rulesets.rules&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;schemavalidation.schemas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;snippets&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zerotrust.dlp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zerotrust.networks&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;features&quot;&gt;Features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;aiohttp-backend-support&quot;&gt;aiohttp Backend Support&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#aiohttp-backend-support&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The async client now supports an optional &lt;code&gt;aiohttp&lt;/code&gt; HTTP backend for improved concurrency performance. Install with &lt;code&gt;pip install cloudflare[aiohttp]&lt;/code&gt; and use &lt;code&gt;DefaultAioHttpClient()&lt;/code&gt; as the &lt;code&gt;http_client&lt;/code&gt; parameter.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;python-313-and-314-support&quot;&gt;Python 3.13 and 3.14 Support&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#python-313-and-314-support&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Python 3.13 and 3.14 are now tested and supported.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-services&quot;&gt;New Services&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-services&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The following top-level resources are new in this release:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Client Path&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI Search&lt;/td&gt;
&lt;td&gt;&lt;code&gt;aisearch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;AI-powered search capabilities&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connectivity&lt;/td&gt;
&lt;td&gt;&lt;code&gt;connectivity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Connectivity testing and diagnostics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email Sending&lt;/td&gt;
&lt;td&gt;&lt;code&gt;email_sending&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Email send and send_raw endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fraud&lt;/td&gt;
&lt;td&gt;&lt;code&gt;fraud&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Fraud detection and prevention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Tag Gateway&lt;/td&gt;
&lt;td&gt;&lt;code&gt;google_tag_gateway&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Google Tag Gateway management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organizations&lt;/td&gt;
&lt;td&gt;&lt;code&gt;organizations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Organization audit logs and management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2 Data Catalog&lt;/td&gt;
&lt;td&gt;&lt;code&gt;r2_data_catalog&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;R2 Data Catalog operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Realtime Kit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;realtime_kit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Realtime communication (Calls/TURN)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource Tagging&lt;/td&gt;
&lt;td&gt;&lt;code&gt;resource_tagging&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Resource tagging and labeling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token Validation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;token_validation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Token validation configuration and rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulnerability Scanner&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vulnerability_scanner&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Vulnerability scanning, credential sets, and target environments&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-endpoints-on-existing-services&quot;&gt;New Endpoints on Existing Services&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-endpoints-on-existing-services&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;api_gateway&lt;/strong&gt;: Labels endpoints&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;billing&lt;/strong&gt;: Billable usage PayGo endpoint&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;brand_protection&lt;/strong&gt;: v2 endpoints&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;browser_rendering&lt;/strong&gt;: DevTools methods&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cache&lt;/strong&gt;: Origin cloud regions resource&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;custom_origin_trust_store&lt;/strong&gt;: Custom origin trust store&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dns&lt;/strong&gt;: &lt;code&gt;dns_records/usage&lt;/code&gt; endpoints&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;email_security&lt;/strong&gt;: Phishguard reports endpoint&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;iam&lt;/strong&gt;: User groups and user group members resources&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;radar&lt;/strong&gt;: Botnet Threat Feed and Post-Quantum endpoints&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers&lt;/strong&gt;: Observability Destinations resources&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust&lt;/strong&gt;: Access Users, DEX rules, Device IP Profile, Device Subnet, WARP Connector connections and failover, WARP Subnet, Gateway PAC files&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zones&lt;/strong&gt;: Zone environments endpoints&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;bug-fixes&quot;&gt;Bug Fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bug-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;polymorphic_serialization&lt;/code&gt; parameter in &lt;code&gt;model_dump&lt;/code&gt; overrides&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;BaseModel&lt;/code&gt; base to response &lt;code&gt;SchemaFieldStruct&lt;/code&gt;/&lt;code&gt;SchemaFieldList&lt;/code&gt; stubs in Pipelines&lt;/li&gt;
&lt;li&gt;Added missing &lt;code&gt;model_rebuild&lt;/code&gt;/&lt;code&gt;update_forward_refs&lt;/code&gt; for &lt;code&gt;SharedEntryCustomEntry&lt;/code&gt; classes in DLP&lt;/li&gt;
&lt;li&gt;Made &lt;code&gt;RunQueryParametersNeedleValue&lt;/code&gt; a &lt;code&gt;BaseModel&lt;/code&gt; with &lt;code&gt;arbitrary_types_allowed&lt;/code&gt; in Workers&lt;/li&gt;
&lt;li&gt;Removed duplicate &lt;code&gt;notification_url&lt;/code&gt; field in webhook response types for Stream&lt;/li&gt;
&lt;li&gt;Resolved pre-existing codegen type errors&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;type: ignore[call-arg]&lt;/code&gt; placement for mypy compatibility in Radar&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;deprecations&quot;&gt;Deprecations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#deprecations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Resources with &lt;code&gt;@deprecated&lt;/code&gt; annotations on some methods include: &lt;code&gt;accounts&lt;/code&gt;, &lt;code&gt;addressing&lt;/code&gt;, &lt;code&gt;ai-gateway&lt;/code&gt;, &lt;code&gt;aisearch&lt;/code&gt;, &lt;code&gt;api-gateway&lt;/code&gt;, &lt;code&gt;billing&lt;/code&gt;, &lt;code&gt;cloudforce-one&lt;/code&gt;, &lt;code&gt;dns&lt;/code&gt;, &lt;code&gt;email-routing&lt;/code&gt;, &lt;code&gt;email-security&lt;/code&gt;, &lt;code&gt;filters&lt;/code&gt;, &lt;code&gt;firewall&lt;/code&gt;, &lt;code&gt;images&lt;/code&gt;, &lt;code&gt;intel&lt;/code&gt;, &lt;code&gt;kv&lt;/code&gt;, &lt;code&gt;logpush&lt;/code&gt;, &lt;code&gt;origin-tls-client-auth&lt;/code&gt;, &lt;code&gt;pages&lt;/code&gt;, &lt;code&gt;pipelines&lt;/code&gt;, &lt;code&gt;radar&lt;/code&gt;, &lt;code&gt;rate-limits&lt;/code&gt;, &lt;code&gt;registrar&lt;/code&gt;, &lt;code&gt;rulesets&lt;/code&gt;, &lt;code&gt;ssl&lt;/code&gt;, &lt;code&gt;user&lt;/code&gt;, &lt;code&gt;workers&lt;/code&gt;, &lt;code&gt;workers-for-platforms&lt;/code&gt;, &lt;code&gt;zero-trust&lt;/code&gt;, &lt;code&gt;zones&lt;/code&gt;&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/cloudflare-python/releases/tag/v5.0.0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Download Python SDK v5.0.0&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/sdks/python/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Python SDK documentation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/cloudflare-python/blob/main/docs/migration-guides/v5.0.0-migration-guide.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Migration Guide&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><product>SDK</product><category>SDK</category></item><item><title>SDK - Cloudflare TypeScript SDK v6.0.0 Released</title><link>https://developers.cloudflare.com/changelog/post/2026-04-30-cloudflare-typescript-v6.0.0/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-30-cloudflare-typescript-v6.0.0/</guid><description>&lt;p&gt;Full Changelog: &lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript/compare/v6.0.0-beta.2...v6.0.0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v6.0.0-beta.2...v6.0.0&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Please ensure you read through the list of changes below before moving to this version&lt;/strong&gt; - this will help you understand any down or upstream issues it may cause to your environments.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;breaking-changes&quot;&gt;Breaking Changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#breaking-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;sdk-infrastructure&quot;&gt;SDK Infrastructure&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#sdk-infrastructure&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Retry-After handling changed&lt;/strong&gt;: The SDK now respects any server-specified &lt;code&gt;Retry-After&lt;/code&gt; value for rate-limited requests. Previously, values over 60 seconds were ignored and a default backoff was used instead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Empty response handling&lt;/strong&gt;: Responses with &lt;code&gt;content-length: 0&lt;/code&gt; now return &lt;code&gt;undefined&lt;/code&gt; instead of attempting to parse the body.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Environment variable reading&lt;/strong&gt;: Empty string env vars (for example, &lt;code&gt;CLOUDFLARE_API_TOKEN=&quot;&quot;&lt;/code&gt;) are now treated as unset.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path query parameter merging&lt;/strong&gt;: URL search params embedded in endpoint paths are now extracted and merged into the query object.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;removed-endpoints-17&quot;&gt;Removed Endpoints (17)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#removed-endpoints-17&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;17 HTTP endpoints were removed from the SDK, affecting &lt;code&gt;abuse-reports&lt;/code&gt;, &lt;code&gt;cloudforce-one&lt;/code&gt;, &lt;code&gt;dlp/profiles/predefined&lt;/code&gt;, &lt;code&gt;email-security/investigate&lt;/code&gt;, &lt;code&gt;email-security/settings&lt;/code&gt;, and &lt;code&gt;intel/ip-list&lt;/code&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;method-signature-changes&quot;&gt;Method Signature Changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#method-signature-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;client.ai.toMarkdown.transform(file, \{ ...params \})&lt;/code&gt; -&amp;gt; &lt;code&gt;client.ai.toMarkdown.transform(\{ ...params \})&lt;/code&gt; -- &lt;code&gt;file&lt;/code&gt; moved from positional arg into params body&lt;/li&gt;
&lt;li&gt;&lt;code&gt;client.radar.ai.toMarkdown.create(body, \{ ...params \})&lt;/code&gt; -&amp;gt; &lt;code&gt;client.radar.ai.toMarkdown.create(\{ ...params \})&lt;/code&gt; -- &lt;code&gt;body&lt;/code&gt; moved from positional arg into params&lt;/li&gt;
&lt;li&gt;&lt;code&gt;client.abuseReports.create(reportType, \{ ...params \})&lt;/code&gt; -&amp;gt; &lt;code&gt;client.abuseReports.create(reportParam, \{ ...params \})&lt;/code&gt; -- positional arg renamed&lt;/li&gt;
&lt;li&gt;&lt;code&gt;client.iam.userGroups.members.create(userGroupId, [ ...body ])&lt;/code&gt; -&amp;gt; &lt;code&gt;client.iam.userGroups.members.create(userGroupId, [ ...members ])&lt;/code&gt; -- body array param renamed&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;renamed-client-paths&quot;&gt;Renamed Client Paths&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#renamed-client-paths&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;client.originTLSClientAuth.hostnames.certificates&lt;/code&gt; -&amp;gt; &lt;code&gt;client.originTLSClientAuth.zoneCertificates&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;client.radar.netflows&lt;/code&gt; -&amp;gt; &lt;code&gt;client.radar.netFlows&lt;/code&gt; (casing change)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;return-type-changes-179&quot;&gt;Return Type Changes (179)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#return-type-changes-179&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;133 methods now return &lt;code&gt;null&lt;/code&gt;&lt;/strong&gt; instead of a typed response object. This primarily affects delete operations across &lt;code&gt;accounts&lt;/code&gt;, &lt;code&gt;cache&lt;/code&gt;, &lt;code&gt;d1&lt;/code&gt;, &lt;code&gt;filters&lt;/code&gt;, &lt;code&gt;firewall&lt;/code&gt;, &lt;code&gt;hyperdrive&lt;/code&gt;, &lt;code&gt;iam&lt;/code&gt;, &lt;code&gt;kv&lt;/code&gt;, &lt;code&gt;logpush&lt;/code&gt;, &lt;code&gt;logs&lt;/code&gt;, &lt;code&gt;r2&lt;/code&gt;, &lt;code&gt;stream&lt;/code&gt;, &lt;code&gt;workers&lt;/code&gt;, &lt;code&gt;zero-trust&lt;/code&gt;, &lt;code&gt;zones&lt;/code&gt;, and others.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;17 methods changed pagination type&lt;/strong&gt; (for example, &lt;code&gt;KeysCursorPaginationAfter&lt;/code&gt; -&amp;gt; &lt;code&gt;KeysCursorLimitPagination&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;29 methods changed to a different named type&lt;/strong&gt; (for example, &lt;code&gt;CloudflaredCreateResponse&lt;/code&gt; -&amp;gt; &lt;code&gt;CloudflareTunnel&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;removed-types-43&quot;&gt;Removed Types (43)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#removed-types-43&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;24 shared types removed from root namespace (&lt;code&gt;ASN&lt;/code&gt;, &lt;code&gt;AuditLog&lt;/code&gt;, &lt;code&gt;Member&lt;/code&gt;, &lt;code&gt;Permission&lt;/code&gt;, &lt;code&gt;Role&lt;/code&gt;, &lt;code&gt;Subscription&lt;/code&gt;, &lt;code&gt;Token&lt;/code&gt;, etc.). 19 response types consolidated or renamed.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;resource-restructuring&quot;&gt;Resource Restructuring&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#resource-restructuring&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;19 resources were restructured from single files to directories. Public API client paths are unchanged, but deep imports may break.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-top-level-resources&quot;&gt;New Top-Level Resources&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-top-level-resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;11 entirely new resources added to the client:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Client Path&lt;/th&gt;
&lt;th&gt;Methods&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI Search&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client.aiSearch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;Instances, namespaces, tokens, and items&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connectivity&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client.connectivity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Directory service APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email Sending&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client.emailSending&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Send and send_raw endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fraud&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client.fraud&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Fraud detection API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Tag Gateway&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client.googleTagGateway&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Google Tag Gateway management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Organizations&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client.organizations&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Organization profiles and audit logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R2 Data Catalog&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client.r2DataCatalog&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;R2 Data Catalog routes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Realtime Kit&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client.realtimeKit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;Realtime Kit APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource Tagging&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client.resourceTagging&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Resource tagging routes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token Validation&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client.tokenValidation&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;Token validation rules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vulnerability Scanner&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client.vulnerabilityScanner&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;Vulnerability scanning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-sub-resources-on-existing-resources&quot;&gt;New Sub-Resources on Existing Resources&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-sub-resources-on-existing-resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;browser-rendering&lt;/strong&gt;: &lt;code&gt;crawl&lt;/code&gt;, &lt;code&gt;devtools&lt;/code&gt; - Crawl endpoints and DevTools methods&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cache&lt;/strong&gt;: &lt;code&gt;origin-cloud-regions&lt;/code&gt; - Origin cloud regions resource&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dns&lt;/strong&gt;: &lt;code&gt;usage&lt;/code&gt; - DNS records usage endpoints&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;d1&lt;/strong&gt;: &lt;code&gt;time-travel&lt;/code&gt; - Time travel get_bookmark and restore&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;email-security&lt;/strong&gt;: &lt;code&gt;phishguard&lt;/code&gt; - Phishguard reports endpoint&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pipelines&lt;/strong&gt;: &lt;code&gt;sinks&lt;/code&gt;, &lt;code&gt;streams&lt;/code&gt; - Pipelines restructure&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;radar&lt;/strong&gt;: &lt;code&gt;agent-readiness&lt;/code&gt;, &lt;code&gt;geolocations&lt;/code&gt;, &lt;code&gt;post-quantum&lt;/code&gt; - New analytics endpoints&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers&lt;/strong&gt;: &lt;code&gt;observability&lt;/code&gt; - Observability destinations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zones&lt;/strong&gt;: &lt;code&gt;environments&lt;/code&gt; - Zone environments endpoints&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;api-gateway&lt;/strong&gt;: &lt;code&gt;labels&lt;/code&gt; - Labels endpoints&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;brand-protection&lt;/strong&gt;: &lt;code&gt;v2&lt;/code&gt; - V2 endpoints&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;alerting&lt;/strong&gt;: &lt;code&gt;silences&lt;/code&gt; - Alert silencing API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;billing&lt;/strong&gt;: &lt;code&gt;usage&lt;/code&gt; - Billable usage PayGo endpoint&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;iam&lt;/strong&gt;: &lt;code&gt;sso&lt;/code&gt; - SSO Connectors resource&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;queues&lt;/strong&gt;: &lt;code&gt;getMetrics&lt;/code&gt; method - Queues metrics endpoint&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;registrar&lt;/strong&gt;: &lt;code&gt;registration-status&lt;/code&gt;, &lt;code&gt;update-status&lt;/code&gt; - Registrar API convergence&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero-trust&lt;/strong&gt;: DLP settings, DEX rules, Access Users, WARP Connector, WARP Subnets, Gateway PAC files, Gateway tenants&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;bug-fixes&quot;&gt;Bug Fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bug-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Resolved type errors from codegen overwriting manual fixes&lt;/li&gt;
&lt;li&gt;Fixed &lt;code&gt;post()&lt;/code&gt; usage for to-markdown endpoints to resolve async type error&lt;/li&gt;
&lt;li&gt;Added least-privilege permissions to all workflow jobs&lt;/li&gt;
&lt;li&gt;Reverted erroneous removal of rulesets resource methods and types&lt;/li&gt;
&lt;li&gt;Resolved prettier formatting errors in codegen output&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;deprecations&quot;&gt;Deprecations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#deprecations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The following resources now include &lt;code&gt;@deprecated&lt;/code&gt; annotations on some methods:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;accounts&lt;/code&gt;, &lt;code&gt;addressing&lt;/code&gt;, &lt;code&gt;ai-gateway&lt;/code&gt;, &lt;code&gt;aisearch&lt;/code&gt;, &lt;code&gt;api-gateway&lt;/code&gt;, &lt;code&gt;billing&lt;/code&gt;, &lt;code&gt;cloudforce-one&lt;/code&gt;, &lt;code&gt;custom-nameservers&lt;/code&gt;, &lt;code&gt;dns&lt;/code&gt;, &lt;code&gt;email-routing&lt;/code&gt;, &lt;code&gt;email-security&lt;/code&gt;, &lt;code&gt;filters&lt;/code&gt;, &lt;code&gt;firewall&lt;/code&gt;, &lt;code&gt;images&lt;/code&gt;, &lt;code&gt;intel&lt;/code&gt;, &lt;code&gt;keyless-certificates&lt;/code&gt;, &lt;code&gt;kv&lt;/code&gt;, &lt;code&gt;logpush&lt;/code&gt;, &lt;code&gt;origin-tls-client-auth&lt;/code&gt;, &lt;code&gt;page-shield&lt;/code&gt;, &lt;code&gt;pages&lt;/code&gt;, &lt;code&gt;pipelines&lt;/code&gt;, &lt;code&gt;radar&lt;/code&gt;, &lt;code&gt;rate-limits&lt;/code&gt;, &lt;code&gt;registrar&lt;/code&gt;, &lt;code&gt;rulesets&lt;/code&gt;, &lt;code&gt;ssl&lt;/code&gt;, &lt;code&gt;user&lt;/code&gt;, &lt;code&gt;workers&lt;/code&gt;, &lt;code&gt;workers-for-platforms&lt;/code&gt;, &lt;code&gt;zero-trust&lt;/code&gt;, &lt;code&gt;zones&lt;/code&gt;&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript/releases/tag/v6.0.0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Download TypeScript SDK v6.0.0&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/sdks/typescript/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TypeScript SDK documentation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript/blob/main/CHANGELOG.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Full Changelog&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><product>SDK</product><category>SDK</category></item><item><title>Speed - Shared dictionaries passthrough now in open beta</title><link>https://developers.cloudflare.com/changelog/post/2026-04-30-shared-dictionaries-passthrough-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-30-shared-dictionaries-passthrough-beta/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/speed/optimization/content/shared-dictionaries/&quot;&gt;Shared dictionaries&lt;/a&gt; (&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9842.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 9842&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;) 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-changed&quot;&gt;What changed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In passthrough mode, Cloudflare:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Forwards the &lt;code&gt;Use-As-Dictionary&lt;/code&gt; and &lt;code&gt;Available-Dictionary&lt;/code&gt; headers between client and origin without modification.&lt;/li&gt;
&lt;li&gt;Treats &lt;code&gt;dcb&lt;/code&gt; (Dictionary-Compressed Brotli) and &lt;code&gt;dcz&lt;/code&gt; (Dictionary-Compressed Zstandard) as valid &lt;code&gt;Content-Encoding&lt;/code&gt; values end to end, without recompressing them.&lt;/li&gt;
&lt;li&gt;Extends the cache key to vary on &lt;code&gt;Available-Dictionary&lt;/code&gt; and &lt;code&gt;Accept-Encoding&lt;/code&gt; so each delta-compressed variant is cached correctly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Your origin manages the dictionary lifecycle: deciding which assets are dictionaries, attaching &lt;code&gt;Use-As-Dictionary&lt;/code&gt; headers, and producing deltas in response to &lt;code&gt;Available-Dictionary&lt;/code&gt; requests. Cloudflare handles the transport and the cache.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Shared dictionaries work with browsers that advertise &lt;code&gt;dcb&lt;/code&gt; or &lt;code&gt;dcz&lt;/code&gt; in &lt;code&gt;Accept-Encoding&lt;/code&gt;. Today, this includes Chrome 130 or later and Edge 130 or later.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Turn on passthrough for your zone with a single API call:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/zones/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ZONE_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/settings/shared_dictionary_mode&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	--request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; PATCH&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	--header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	--json&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;		&quot;value&quot;: &quot;passthrough&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;You can also turn it on under &lt;strong&gt;Speed&lt;/strong&gt; &amp;gt; &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Content Optimization&lt;/strong&gt; in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/:zone/speed/optimization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. For full origin setup instructions and a working test recipe, refer to &lt;a href=&quot;https://developers.cloudflare.com/speed/optimization/content/shared-dictionaries/&quot;&gt;Shared dictionaries&lt;/a&gt;, or try the live demo at &lt;a href=&quot;https://canicompress.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;canicompress.com&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><product>Speed</product><category>Speed</category></item><item><title>WAF - WAF Release - 2026-04-30 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2026-04-30-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-30-emergency-waf-release/</guid><description>
&lt;p&gt;This emergency release introduces a new rule to block a cPanel &amp;amp; WHM Authentication Bypass related to CVE-2026-41940.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CVE-2026-41940: A critical authentication bypass vulnerability in cPanel &amp;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Successful exploitation allows unauthenticated attackers to gain administrative control over affected cPanel &amp;amp; WHM installations. This leads to complete server compromise, potential theft or manipulation of hosted data, and significant service disruption across managed environments.&lt;/p&gt;
&lt;p&gt;We strongly recommend applying official vendor patches for cPanel &amp;amp; WHM immediately to address the underlying vulnerability.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;fb29b1b660864285a5ebac86eb2b9e2f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...eb2b9e2f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;cPanel - Auth Bypass - CVE:CVE-2026-41940&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Cloudflare Web Analytics - Web Analytics adds Navigation Type filtering and reporting</title><link>https://developers.cloudflare.com/changelog/post/2026-04-30-rum-navigation-types/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-30-rum-navigation-types/</guid><description>&lt;p&gt;Cloudflare Web Analytics now supports &lt;strong&gt;Navigation Type&lt;/strong&gt; reporting and filtering.&lt;/p&gt;
&lt;p&gt;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&apos;s back/forward buttons — and whether a browser cache hit occurred for these behaviors.&lt;/p&gt;
&lt;p&gt;Understanding navigation types is critical for optimizing user experience. For example, if a high volume of your traffic consists of &quot;Back-forward&quot; navigations versus &quot;Back-forward Cache&quot;, those visitors are not benefiting from the Back/Forward Cache (bfcache) and therefore are experiencing higher load times due to potentially unnecessary network requests.&lt;/p&gt;
&lt;p&gt;The same applies for regular &quot;Navigate&quot; entries — where &quot;Navigate Cache&quot;, &quot;Navigate Prefetch Cache&quot; and &quot;Prerender&quot; would provide instant document retrieval — and &quot;Reload&quot;, where &quot;Reload cache&quot; would be more optimal.&lt;/p&gt;
&lt;p&gt;A high volume of &quot;Reload&quot; entries can also indicate a potential stability problem with your website.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/web-analytics/data-metrics/dimensions/#navigation-types&quot;&gt;Navigation Types&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-benefits&quot;&gt;Key benefits&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-benefits&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Monitor Cache Effectiveness:&lt;/strong&gt; See how often your site is served from the HTTP cache or bfcache.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identify Performance Bottlenecks:&lt;/strong&gt; Filter by the different types to understand performance opportunity of improving browser cache hit ratio.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;analyze-navigation-types-in-the-cloudflare-dashboard&quot;&gt;Analyze navigation types in the Cloudflare dashboard&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#analyze-navigation-types-in-the-cloudflare-dashboard&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can now find the &lt;strong&gt;Navigation Type&lt;/strong&gt; dimension in the Web Analytics dashboard. You can filter to include/exclude one or more specific types using &quot;equals&quot;, &quot;does not equal&quot;, &quot;in&quot;, or &quot;not in&quot; matchers.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2646,height=1040,format=webp/_astro/dash-web_analytics-navigation-type-filter.Cculflhp.png&quot; alt=&quot;Navigation Type filter&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2646&quot; height=&quot;1040&quot;&gt;
&lt;p&gt;To check the list of popular navigation types, select &lt;strong&gt;Page views&lt;/strong&gt; on the Web Analytics sidebar and scroll down to the bottom:&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2076,height=500,format=webp/_astro/dash-web_analytics-navigation-types-list.CWaiEQzO.png&quot; alt=&quot;Navigation Types list in Page Views tab&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2076&quot; height=&quot;500&quot;&gt;</description><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><product>Cloudflare Web Analytics</product><category>Cloudflare Web Analytics</category></item><item><title>Digital Experience Monitoring - Digital experience tests to authenticated resources and enhanced configuration</title><link>https://developers.cloudflare.com/changelog/post/2026-04-29-dex-tests-to-auth/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-29-dex-tests-to-auth/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/dex/tests/&quot;&gt;Digital experience tests&lt;/a&gt; now support testing applications protected by Cloudflare Access or third-party authentication. All authentication secrets are managed via &lt;a href=&quot;https://developers.cloudflare.com/secrets-store/&quot;&gt;Cloudflare Secret Store&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Digital experience tests also have enhanced configuration options including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New HTTP methods (DELETE, PATCH, POST, PUT)&lt;/li&gt;
&lt;li&gt;Secret Store headers, custom plain text headers, and custom request bodies&lt;/li&gt;
&lt;li&gt;Advanced settings: follow redirects, response bodies, response headers, and allow untrusted certificates&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2840,height=1374,format=webp/_astro/dex_test_auth_config.CD3G3zb_.png&quot; alt=&quot;Digital experience test configuration for Cloudflare Access applications&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2840&quot; height=&quot;1374&quot;&gt;&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2840,height=1496,format=webp/_astro/dex_test_enhanced_config.Nsv7Vcob.png&quot; alt=&quot;Digital experience enhanced test configuration&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2840&quot; height=&quot;1496&quot;&gt;</description><pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate><product>Digital Experience Monitoring</product><category>Digital Experience Monitoring</category></item><item><title>Cloudflare Fundamentals - Instant Bank Payments via Link</title><link>https://developers.cloudflare.com/changelog/post/2026-04-29-instant-bank-payments-via-link/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-29-instant-bank-payments-via-link/</guid><description>&lt;p&gt;You can now pay for Cloudflare services directly from your bank account using &lt;a href=&quot;https://developers.cloudflare.com/billing/payment-methods/instant-bank-payments-link/&quot;&gt;Instant Bank Payments via Link&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-changed&quot;&gt;What changed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://link.co/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Link&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;img src=&quot;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&quot; alt=&quot;Instant Bank Payments via Link at checkout&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;413&quot; height=&quot;562&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;how-to-use-it&quot;&gt;How to use it&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#how-to-use-it&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;During checkout, select your bank account from your saved Link payment methods.&lt;/li&gt;
&lt;li&gt;Confirm the payment.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After your first Link authentication, your bank account is available for future purchases without re-entering details.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;who-is-eligible&quot;&gt;Who is eligible&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#who-is-eligible&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Instant Bank Payments via Link is available to US-based self-serve accounts across all Cloudflare products. Your existing cards remain available at checkout.&lt;/p&gt;
&lt;p&gt;Bank-based Link payments appear in your billing history with the payment method shown as &lt;code&gt;link&lt;/code&gt; and last four digits as &lt;code&gt;0000&lt;/code&gt;. For details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/billing/payment-methods/instant-bank-payments-link/&quot;&gt;Instant Bank Payments via Link documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Gateway - Gateway Authorization Proxy and hosted PAC files are now generally available</title><link>https://developers.cloudflare.com/changelog/post/2026-04-29-gateway-authorization-proxy-pac-files-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-29-gateway-authorization-proxy-pac-files-ga/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#authorization-endpoint&quot;&gt;Gateway Authorization Proxy&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#create-a-hosted-pac-file&quot;&gt;hosted PAC files&lt;/a&gt; are now generally available for all plan types.&lt;/p&gt;
&lt;p&gt;Authorization proxy endpoints add an identity-aware option alongside the existing &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#source-ip-endpoint&quot;&gt;source IP proxy endpoints&lt;/a&gt;, using &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/&quot;&gt;Cloudflare Access&lt;/a&gt; authentication to verify who a user is before applying Gateway filtering — without installing the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/&quot;&gt;Cloudflare One Client&lt;/a&gt;. Cloudflare-hosted PAC files let you create and distribute PAC files directly from Cloudflare One on Cloudflare&apos;s global network.&lt;/p&gt;
&lt;p&gt;These features are ideal for environments where deploying a device client is not an option, such as virtual desktops (VDI) or compliance-restricted endpoints.&lt;/p&gt;
&lt;p&gt;To get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/&quot;&gt;proxy endpoints documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category></item><item><title>Hyperdrive - Hyperdrive support for private databases with Workers VPC</title><link>https://developers.cloudflare.com/changelog/post/2026-04-29-hyperdrive-vpc-private-databases/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-29-hyperdrive-vpc-private-databases/</guid><description>&lt;p&gt;You can now connect Hyperdrive to a private database through a &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/&quot;&gt;Workers VPC service&lt;/a&gt;. This is the recommended way to connect Hyperdrive to a private database that is not exposed to the public Internet.&lt;/p&gt;
&lt;p&gt;When creating a Hyperdrive configuration in the Cloudflare dashboard, choose &lt;strong&gt;Connect to private database&lt;/strong&gt; and then &lt;strong&gt;Workers VPC&lt;/strong&gt;. 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.&lt;/p&gt;
&lt;p&gt;You can also create a Hyperdrive configuration backed by a Workers VPC service from the command line:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; hyperdrive&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-vpc-database&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --service-id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;YOUR_VPC_SERVICE_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --database&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;DATABASE_NAM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --user&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;DATABASE_USE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;R&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --password&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;DATABASE_PASSWOR&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --scheme&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; postgresql&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To get started, refer to &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/configuration/connect-to-private-database-vpc/&quot;&gt;Connect Hyperdrive to a private database using Workers VPC&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>Digital Experience Monitoring - Internet outage notifications for devices</title><link>https://developers.cloudflare.com/changelog/post/2026-04-28-dex-internet-outage-notification/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-28-dex-internet-outage-notification/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/dex/&quot;&gt;Digital Experience&lt;/a&gt; will display a dashboard notification when an Internet outage or traffic anomaly may impact a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/&quot;&gt;Cloudflare One Client&lt;/a&gt; device based on its geographic location or network connection.&lt;/p&gt;
&lt;p&gt;This Internet outage and traffic anomaly data is pulled from &lt;a href=&quot;https://radar.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Radar&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. All Internet outage and traffic anomaly observations can be viewed in the &lt;a href=&quot;https://radar.cloudflare.com/outage-center&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Radar Outage Center&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2076,height=314,format=webp/_astro/dex_radar_ux_notification.CpdrUVYA.png&quot; alt=&quot;Digital Experience Monitoring dashboard notification for Internet outage impacting Cloudflare One Client devices&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2076&quot; height=&quot;314&quot;&gt;&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2068,height=909,format=webp/_astro/dex_radar_analytics.GaPxWM6C.png&quot; alt=&quot;Digital Experience Monitoring dashboard analytics for Internet outage impacting Cloudflare One Client devices&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2068&quot; height=&quot;909&quot;&gt;</description><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><product>Digital Experience Monitoring</product><category>Digital Experience Monitoring</category></item><item><title>Digital Experience Monitoring - Cloudflare One Client speed tests</title><link>https://developers.cloudflare.com/changelog/post/2026-04-28-dex-speed-test/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-28-dex-speed-test/</guid><description>&lt;p&gt;IT teams can now remotely run speed tests from the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/&quot;&gt;Cloudflare One Client&lt;/a&gt; to Cloudflare&apos;s network edge.&lt;/p&gt;
&lt;p&gt;Each speed test includes the following metrics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internet speed: download and upload throughput&lt;/li&gt;
&lt;li&gt;Latency: download, upload, unloaded latency, and jitter&lt;/li&gt;
&lt;li&gt;Network quality score: video streaming, webchat/real-time communication (RTC)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, go to &lt;strong&gt;Zero Trust&lt;/strong&gt; &amp;gt; &lt;strong&gt;Insights&lt;/strong&gt; &amp;gt; &lt;strong&gt;Digital experience&lt;/strong&gt; &amp;gt; &lt;strong&gt;Diagnostics&lt;/strong&gt; and select &lt;strong&gt;Run diagnostics&lt;/strong&gt; to use the feature today.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2906,height=1730,format=webp/_astro/dex_speed_test.DukupcRs.png&quot; alt=&quot;Cloudflare One client speed test result&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2906&quot; height=&quot;1730&quot;&gt;</description><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><product>Digital Experience Monitoring</product><category>Digital Experience Monitoring</category></item><item><title>Data Loss Prevention - Create and manage DLP detection entries outside of profiles</title><link>https://developers.cloudflare.com/changelog/post/2026-04-28-detection-entries-outside-profiles/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-28-detection-entries-outside-profiles/</guid><description>&lt;p&gt;You can now create, view, and manage DLP detection entries outside of profiles.&lt;/p&gt;
&lt;p&gt;Detection entries are no longer hidden inside individual profiles. Administrators can manage detection entries directly from the &lt;strong&gt;Detection entries&lt;/strong&gt; section and use them in custom DLP profiles.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/detection-entries/configure-detection-entries/&quot;&gt;Configure detection entries&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><product>Data Loss Prevention</product><category>Data Loss Prevention</category></item><item><title>Data Loss Prevention - Detect PII records with a new predefined DLP profile</title><link>https://developers.cloudflare.com/changelog/post/2026-04-28-pii-record-profile/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-28-pii-record-profile/</guid><description>&lt;p&gt;Cloudflare DLP now includes a new predefined profile designed to detect PII records that contain multiple types of personal data: &lt;strong&gt;Personally Identifiable Information (PII) Record&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Most predefined and custom DLP profiles match when any enabled detection entry matches. The &lt;strong&gt;Personally Identifiable Information (PII) Record&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;Detection entries included in the profile:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AU Passport Number&lt;/li&gt;
&lt;li&gt;American Express Card Number&lt;/li&gt;
&lt;li&gt;Diners Club Card Number&lt;/li&gt;
&lt;li&gt;US Driver&apos;s License Number&lt;/li&gt;
&lt;li&gt;Email Address&lt;/li&gt;
&lt;li&gt;Full Name&lt;/li&gt;
&lt;li&gt;US Mailing Address&lt;/li&gt;
&lt;li&gt;Mastercard Card Number&lt;/li&gt;
&lt;li&gt;US Individual Tax Identification Number (ITIN)&lt;/li&gt;
&lt;li&gt;US Passport Number&lt;/li&gt;
&lt;li&gt;US Phone Number&lt;/li&gt;
&lt;li&gt;Union Pay Card Number&lt;/li&gt;
&lt;li&gt;United States SSN Numeric Detection&lt;/li&gt;
&lt;li&gt;Visa Card Number&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/predefined-profiles/&quot;&gt;predefined DLP profiles&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><product>Data Loss Prevention</product><category>Data Loss Prevention</category></item><item><title>DNS - Account-level enforce DNS-only</title><link>https://developers.cloudflare.com/changelog/post/2026-04-28-enforce-dns-only/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-28-enforce-dns-only/</guid><description>
&lt;p&gt;You can now disable Cloudflare&apos;s reverse proxy across all zones in your account simultaneously using the new &lt;code&gt;enforce_dns_only&lt;/code&gt; setting. When enabled, Cloudflare responds to DNS queries for all proxied records with your origin IP addresses instead of Cloudflare&apos;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.&lt;/p&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Caution&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-warning); --_t: var(--nb-warning-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:warning&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Caution&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/dns/proxy-status/enforce-dns-only/#preparation&quot;&gt;preparations&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-characteristics&quot;&gt;Key characteristics&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-characteristics&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Account-level&lt;/strong&gt; — Affects all zones in the account simultaneously with a single API call.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Non-destructive&lt;/strong&gt; — Does not modify your DNS records. Disabling the setting restores normal proxy behavior.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API-only&lt;/strong&gt; — Available through the API only, not in the Cloudflare dashboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-affected&quot;&gt;What&apos;s affected&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-affected&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Included:&lt;/strong&gt; Standard proxied A, AAAA, and CNAME records, Load Balancing records, and records matching Worker routes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Excluded:&lt;/strong&gt; Spectrum applications, Cloudflare Tunnel CNAMEs, R2 custom domains, Web3 gateways, and Workers custom domains continue to operate normally.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;before-you-enable&quot;&gt;Before you enable&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#before-you-enable&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Verify your origin servers can handle direct traffic without Cloudflare&apos;s caching and filtering.&lt;/li&gt;
&lt;li&gt;Review which origin IPs will become publicly visible through DNS queries.&lt;/li&gt;
&lt;li&gt;Test the API in a staging account before relying on it for incident response.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;availability&quot;&gt;Availability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#availability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Available via API to all Cloudflare customers.&lt;/p&gt;
&lt;p&gt;For information on how to use it, refer to &lt;a href=&quot;https://developers.cloudflare.com/dns/proxy-status/enforce-dns-only/&quot;&gt;Enforce DNS-only developer documentation&lt;/a&gt; .&lt;/p&gt;</description><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><product>DNS</product><category>DNS</category></item><item><title>Queues - Realtime backlog metrics now available for Queues</title><link>https://developers.cloudflare.com/changelog/post/2026-04-28-improved-queues-metrics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-28-improved-queues-metrics/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/queues/&quot;&gt;Queues&lt;/a&gt;, Cloudflare&apos;s managed message queue, now exposes realtime backlog metrics via the dashboard, REST API, and JavaScript API. Three new fields are available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;backlog_count&lt;/code&gt;&lt;/strong&gt; — the number of unacknowledged messages in the queue&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;backlog_bytes&lt;/code&gt;&lt;/strong&gt; — the total size of those messages in bytes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;oldest_message_timestamp_ms&lt;/code&gt;&lt;/strong&gt; — the timestamp of the oldest unacknowledged message&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following endpoints also now include a &lt;code&gt;metadata.metrics&lt;/code&gt; object on the result field after successful message consumption:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/accounts/{account_id}/queues/{queue_id}/messages/pull&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/accounts/{account_id}/queues/{queue_id}/messages&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/accounts/{account_id}/queues/{queue_id}/messages/batch&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;javascript-apis&quot;&gt;Javascript APIs&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#javascript-apis&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Call &lt;code&gt;env.QUEUE.metrics()&lt;/code&gt; to get realtime backlog metrics:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	backlogCount&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// number&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	backlogBytes&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// number&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	oldestMessageTimestamp&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Date | undefined&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;QUEUE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;metrics&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;code&gt;env.QUEUE.send()&lt;/code&gt; and &lt;code&gt;env.QUEUE.sendBatch()&lt;/code&gt; also now return a metrics object on the response.&lt;/p&gt;
&lt;p&gt;You can also query these fields via the &lt;a href=&quot;https://developers.cloudflare.com/analytics/graphql-api/&quot;&gt;GraphQL Analytics API&lt;/a&gt; or view realtime backlog on the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/queues&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1402,height=494,format=webp/_astro/2026-04-28-queues-metrics.BYi0hgrD.png&quot; alt=&quot;Queues realtime backlog&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1402&quot; height=&quot;494&quot;&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/queues/observability/metrics/&quot;&gt;Queues metrics&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><product>Queues</product><category>Queues</category></item><item><title>Support - Direct access to Support from the dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-04-28-direct-support-navigation/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-28-direct-support-navigation/</guid><description>&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;direct-access-to-support-from-the-dashboard&quot;&gt;Direct access to Support from the dashboard&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#direct-access-to-support-from-the-dashboard&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;strong&gt;Support&lt;/strong&gt; button in the dashboard global navigation header now takes you directly to the &lt;a href=&quot;https://support.cloudflare.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Support Portal&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, eliminating the previous dropdown menu.&lt;/p&gt;
&lt;p&gt;This change ensures that when you need help, you spend less time navigating the UI and more time getting the answers you need.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-changed&quot;&gt;What changed?&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Previous behavior&lt;/strong&gt;: Selecting &lt;strong&gt;? Support&lt;/strong&gt; opened a dropdown menu with various links (Help Center, Cloudflare Community, etc.).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New behavior&lt;/strong&gt;: Selecting &lt;strong&gt;Support&lt;/strong&gt; immediately redirects your current tab to the Support Portal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To learn more about the resources available to you, refer to the &lt;a href=&quot;https://developers.cloudflare.com/support/contacting-cloudflare-support/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Support documentation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 28 Apr 2026 00:00:00 GMT</pubDate><product>Support</product><category>Support</category></item><item><title>Cache - Cache Response Rules now support zone versioning</title><link>https://developers.cloudflare.com/changelog/post/2026-04-27-cache-response-rules-zone-versioning/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-27-cache-response-rules-zone-versioning/</guid><description>&lt;p&gt;Cache Response Rules now work with &lt;a href=&quot;https://developers.cloudflare.com/version-management/&quot;&gt;Version Management&lt;/a&gt;. You can version response-phase cache settings and promote them through environments, just like Cache Rules and other supported configurations.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-changed&quot;&gt;What changed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;code&gt;Cache-Control&lt;/code&gt; directives, manage cache tags, and strip headers, did not.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;benefits&quot;&gt;Benefits&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#benefits&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Safe rollout of cache behavior changes&lt;/strong&gt;: Test response-phase rules in a staging environment before promoting to production. Catch unintended caching side effects early.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Parity with Cache Rules&lt;/strong&gt;: Cache Response Rules now follow the same versioning workflow as Cache Rules, so you can manage all cache configuration through a single promotion pipeline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Independent environment control&lt;/strong&gt;: Run different response-phase cache settings per environment. For example, strip &lt;code&gt;Set-Cookie&lt;/code&gt; headers in staging to validate cacheability without affecting production traffic.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Configure Cache Response Rules in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/:zone/caching/cache-rules&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; under &lt;strong&gt;Caching&lt;/strong&gt; &amp;gt; &lt;strong&gt;Cache Rules&lt;/strong&gt;, or via the &lt;a href=&quot;https://developers.cloudflare.com/ruleset-engine/rulesets-api/&quot;&gt;Rulesets API&lt;/a&gt;. For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/cache/how-to/cache-response-rules/&quot;&gt;Cache Response Rules documentation&lt;/a&gt; and the &lt;a href=&quot;https://developers.cloudflare.com/version-management/&quot;&gt;Version Management documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><product>Cache</product><category>Cache</category></item><item><title>Cloudflare Fundamentals - Structured error responses for Cloudflare 5xx errors</title><link>https://developers.cloudflare.com/changelog/post/2026-04-27-structured-responses-for-5xx-errors/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-27-structured-responses-for-5xx-errors/</guid><description>&lt;p&gt;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 &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9457&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 9457 (Problem Details for HTTP APIs)&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and include a &lt;code&gt;Retry-After&lt;/code&gt; HTTP header on retryable codes.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;changes&quot;&gt;Changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;5xx coverage.&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fault attribution.&lt;/strong&gt; The &lt;code&gt;error_category&lt;/code&gt; field tells agents where the fault lies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;origin&lt;/code&gt; (502, 504, 520-524) — the origin server is responsible. Transient; retry with the backoff in &lt;code&gt;retry_after&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cloudflare&lt;/code&gt; (500) — Cloudflare&apos;s fault, not the website or the request. Short retry.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ssl&lt;/code&gt; (525, 526) — the origin&apos;s TLS configuration is broken. Do not retry.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Retry-After header.&lt;/strong&gt; Retryable codes (500, 502, 504, 520-524) include a &lt;code&gt;Retry-After&lt;/code&gt; HTTP header matching the &lt;code&gt;retry_after&lt;/code&gt; body field. Non-retryable codes (525, 526) do not include the header.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;negotiation-behavior&quot;&gt;Negotiation behavior&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#negotiation-behavior&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Request header sent&lt;/th&gt;
&lt;th&gt;Response format&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept: application/json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JSON (&lt;code&gt;application/json&lt;/code&gt; content type)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept: application/problem+json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JSON (&lt;code&gt;application/problem+json&lt;/code&gt; content type)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept: application/json, text/markdown;q=0.9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept: text/markdown&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept: text/markdown, application/json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Markdown (equal &lt;code&gt;q&lt;/code&gt;, first-listed wins)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept: */*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HTML (default)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;availability&quot;&gt;Availability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#availability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Available now for all zones on all plans.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Get JSON response for error 522:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -s&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --compressed&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Accept: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -A&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;TestAgent/1.0&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Accept-Encoding: gzip, deflate&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;&amp;lt;YOUR_DOMAIN&amp;gt;/cdn-cgi/error/522&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; jq&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Check presence of the &lt;code&gt;Retry-After&lt;/code&gt; HTTP header associated with the JSON response for error 521:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -s&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --compressed&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -D&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -o&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; /dev/null&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Accept: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -A&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;TestAgent/1.0&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Accept-Encoding: gzip, deflate&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;&amp;lt;YOUR_DOMAIN&amp;gt;/cdn-cgi/error/521&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; grep&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; retry-after&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9457&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 9457 — Problem Details for HTTP APIs&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-5xx-errors/&quot;&gt;Cloudflare 5xx error documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Cloudflare Fundamentals, Resource Tagging - Resource Tagging enters public beta</title><link>https://developers.cloudflare.com/changelog/post/2026-04-27-resource-tagging-public-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-27-resource-tagging-public-beta/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-included&quot;&gt;What&apos;s included&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-included&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Broad resource type support&lt;/strong&gt; — 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 &lt;a href=&quot;https://developers.cloudflare.com/resource-tagging/reference/resource-types/&quot;&gt;full list of supported resource types&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Powerful filtering&lt;/strong&gt; — Query tagged resources using AND/OR logic, negation, and key-only matching. Combine up to 20 filters per query to build precise resource views.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Account and zone-level endpoints&lt;/strong&gt; — Full CRUD operations across both scopes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Token-based authentication&lt;/strong&gt; — Tagging supports &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/get-started/account-owned-tokens/&quot;&gt;Account Owned Tokens&lt;/a&gt; that persist independently of individual users, so your automation keeps running through credential rotations and team changes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible role support&lt;/strong&gt; — Super Administrators, Workers Admins, and Tag Admins can all manage tags.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;api-first-by-design&quot;&gt;API-first by design&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#api-first-by-design&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;dashboard-ui&quot;&gt;Dashboard UI&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#dashboard-ui&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can also view and manage tagged resources directly in the Cloudflare dashboard. Navigate to &lt;strong&gt;Manage Account&lt;/strong&gt; &amp;gt; &lt;strong&gt;Resource Tagging&lt;/strong&gt; to see all tagged resources across your account, filter by resource name or tag, and add or edit tags inline.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2874,height=1234,format=webp/_astro/tagged-resources-dashboard.Dg5WvwiN.png&quot; alt=&quot;Tagged Resources dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2874&quot; height=&quot;1234&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-coming-next&quot;&gt;What&apos;s coming next&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-coming-next&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;current-limitations&quot;&gt;Current limitations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#current-limitations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PUT&lt;/code&gt; replaces all tags on a resource (no partial update). Use the &lt;a href=&quot;https://developers.cloudflare.com/resource-tagging/how-to/manage-tags/#add-a-single-tag&quot;&gt;GET, merge, PUT workflow&lt;/a&gt; to modify individual tags safely.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DELETE&lt;/code&gt; removes all tags from a resource. To remove a single tag, PUT the remaining tags back.&lt;/li&gt;
&lt;li&gt;Querying tags for a resource that has never been tagged returns &lt;code&gt;500&lt;/code&gt; instead of &lt;code&gt;404&lt;/code&gt;. This is a known beta limitation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/resource-tagging/&quot;&gt;Resource Tagging documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>Resource Tagging</category></item><item><title>Security Center - Unified workspace for Brand Protection</title><link>https://developers.cloudflare.com/changelog/post/2026-04-27-unified-workspace-brand-protection/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-27-unified-workspace-brand-protection/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;You can now elect multiple saved queries from your dashboard to generate a consolidated &quot;Combined Matches&quot; view. This allows you to triage results from different brand queries in one unified table&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;You can reset your workspace using the new &quot;Clear Selection&quot; action, making it easier to pivot between different investigation sets.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-benefits&quot;&gt;Key benefits&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-benefits&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;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&lt;/li&gt;
&lt;li&gt;Correlate related campaigns by seeing similar domains or infrastructure patterns that appear across multiple saved queries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Learn more in our &lt;a href=&quot;https://developers.cloudflare.com/security-center/brand-protection/&quot;&gt;Brand Protection documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>WAF - WAF Release - 2026-04-27</title><link>https://developers.cloudflare.com/changelog/post/2026-04-27-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-27-waf-release/</guid><description>
&lt;p&gt;This week&apos;s release focuses on new improvements to enhance coverage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Existing rule enhancements have been deployed to improve detection resilience against broad classes of web attacks and strengthen behavioral coverage.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Continuous Rule Improvements&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;d866f980582748568385b94480cec1dd&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...80cec1dd&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;PostgreSQL - SQLi - COPY - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.  This rule is merged into the original rule
&quot;PostgreSQL - SQLi - COPY - Body (ID: &lt;rule-id id=&quot;705a6b5569d5472596910e3ce7265a4e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...e7265a4e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;). The rule previously known as &quot;PostgreSQL - SQLi - COPY&quot; is now renamed to &quot;PostgreSQL - SQLi - COPY - Body&quot;.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;71d133c374d94559aa9fdf042903de89&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...2903de89&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;PostgreSQL - SQLi - COPY - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;9f1b1b7fd28a401b9d5c172d1036cfa6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1036cfa6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;PostgreSQL - SQLi - COPY - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;8e40416659334b8ba789365755ff389e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...55ff389e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - AND/OR MAKE_SET/ELT - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;SQLi - AND/OR MAKE_SET/ELT - Body&quot; (ID: &lt;rule-id id=&quot;0f41a593c8fe42c38a26f709252d3934&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...252d3934&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;). The rule previously known as &quot;SQLi - AND/OR MAKE_SET/ELT&quot; is now renamed to &quot;SQLi - AND/OR MAKE_SET/ELT - Body&quot;.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;1e0d4372ee1e41b9804b2d5c346487f9&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...346487f9&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - AND/OR MAKE_SET/ELT - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;d2c961a164a64cf6b871c9511ac6ceca&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1ac6ceca&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - AND/OR MAKE_SET/ELT - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;4dacc0e6f32d4c5da3c2293edd471337&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...dd471337&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Common Patterns - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;SQLi - Common Patterns - Body&quot; (ID: &lt;rule-id id=&quot;98f746d07a6d48ab9dae669acb5d0b9b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...cb5d0b9b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;). The rule previously known as &quot;SQLi - Common Patterns&quot; is now renamed to &quot;SQLi - Common Patterns - Body&quot;.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;53a374379f2e41e9934791c1975c07b7&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...975c07b7&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Common Patterns - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;9efedebfc371443f9fe7308605b1b06b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...05b1b06b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Common Patterns - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;d53a791496d64700870334f4dd0ba3c7&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...dd0ba3c7&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Equation - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;SQLi - Equation - Body&quot; (ID: &lt;rule-id id=&quot;e7691e1e4f4d4769909f3df6c2eb3e7f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...c2eb3e7f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;). The rule previously known as &quot;SQLi - Equation&quot; is now renamed to &quot;SQLi - Equation - Body&quot;.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;46efbd3496e64c3f902ad33d3d1c2384&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...3d1c2384&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Equation - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;46b937649a424b7ead90f6d0e1149ea6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...e1149ea6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Equation - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;04d9182545f54ba8a4fa29fe205adbb0&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...205adbb0&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - AND/OR Digit Operator Digit - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;SQLi - AND/OR Digit Operator Digit - Body&quot; (ID: &lt;rule-id id=&quot;762dd334ed0b4273816e3ff13893c564&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...3893c564&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;). The rule previously known as &quot;SQLi - AND/OR Digit Operator Digit&quot; is now renamed to &quot;SQLi - AND/OR Digit Operator Digit - Body&quot;.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;a24e7c15503948bc8766481aad2abbaa&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ad2abbaa&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - AND/OR Digit Operator Digit - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;0c55eb362df64f92a85aa46753acbc0d&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...53acbc0d&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - AND/OR Digit Operator Digit - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;18c9879b7e184c559d23c1652b45a97d&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...2b45a97d&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Benchmark Function - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;SQLi - Benchmark Function - Body&quot; (ID: &lt;rule-id id=&quot;ac4e9ebfb43a4f3998f6072d2ebc44ad&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...2ebc44ad&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;). The rule previously known as &quot;SQLi - Benchmark Function&quot; is now renamed to &quot;SQLi - Benchmark Function - Body&quot;.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;2adbc36c52324efcb4681b829889aadc&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...9889aadc&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Benchmark Function - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;69564af3bc54406080deed72491b28e9&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...491b28e9&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Benchmark Function - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;94b1646f0b0b46ec9b96f7742aa649de&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...2aa649de&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Comparison - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;SQLi - Comparison - Body&quot; (ID: &lt;rule-id id=&quot;8166da327a614849bfa29317e7907480&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...e7907480&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;). The rule previously known as &quot;SQLi - Comparison&quot; is now renamed to &quot;SQLi - Comparison - Body&quot;.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;455ce87681bd4200bf53456c39e3e013&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...39e3e013&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Comparison - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;8152816062ed47f69be0f907f4bdb492&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...f4bdb492&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Comparison - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;d5afd403a0544248b829fe5da1ff3b34&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...a1ff3b34&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - String Concatenation - Body - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection. This rule is merged into the original rule &quot;SQLi - String Concatenation - Headers&quot; (ID: &lt;rule-id id=&quot;3b0c61407d0b4f7d87e516472116d2fe&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...2116d2fe&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;).The rule previously known as &quot;SQLi - String Concatenation - Headers&quot; is now renamed to &quot;SQLi - String Concatenation - Body&quot;. &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;cb0ec290ee454138abe18b750d0e6c3b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...0d0e6c3b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - String Concatenation - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.(Former Id was &lt;rule-id id=&quot;380099df2bb2469c91ebbb7b846d1940&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...846d1940&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;c46d9097c9ef419aa4d9f10626cc211f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...26cc211f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - String Concatenation - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection. (Former Id was &lt;rule-id id=&quot;bd19397228404b85aa3797238fae8c84&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8fae8c84&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;6542d36980cf4018b4d5e2bfeacc78ab&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...eacc78ab&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - SELECT Expression - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;SQLi - SELECT Expression - Body&quot; (ID: &lt;rule-id id=&quot;00da180570d34b5bae2121acd0023a36&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d0023a36&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;). The rule previously known as &quot;SQLi - SELECT Expression&quot; is now renamed to &quot;SQLi - SELECT Expression - Body&quot;.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;4073f7b575ff45dfb7621b43630bb223&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...630bb223&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - SELECT Expression - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;2721e3184d50466ea637e9afdcd6efb5&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...dcd6efb5&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - SELECT Expression - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;7ecca84c08aa4aad9b5a7bda18c47cea&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...18c47cea&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - ORD and ASCII - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;SQLi - ORD and ASCII- Body&quot; (ID: &lt;rule-id id=&quot;2fc38b34a9d744d2a3cbcc41d0d207f9&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d0d207f9&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;). The rule previously known as &quot;SQLi - ORD and ASCII&quot; is now renamed to &quot;SQLi - ORD and ASCII- Body&quot;.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;f6d10e10c9514eb49dcc2122bdb1618f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...bdb1618f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - ORD and ASCII - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;60704f5c5513425c94cf77031d0906b6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1d0906b6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - ORD and ASCII - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;700613b191d3479ea2782b4e9fe4eff5&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...9fe4eff5&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Destructive Operations&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Gateway, Cloudflare One - Network Session Logs now available for all on-ramps</title><link>https://developers.cloudflare.com/changelog/post/2026-04-24-nsl-all-onramps/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-24-nsl-all-onramps/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/zero_trust_network_sessions/&quot;&gt;Zero Trust Network Session Logs&lt;/a&gt; are now generated for all traffic proxied through Cloudflare Gateway, regardless of on-ramp type. This includes traffic from &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/&quot;&gt;proxy endpoints (PAC files)&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/&quot;&gt;Browser Isolation&lt;/a&gt; egress — on-ramps that previously did not generate session logs.&lt;/p&gt;
&lt;p&gt;Customers who already consume the &lt;code&gt;zero_trust_network_sessions&lt;/code&gt; dataset via &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/logs/logpush/&quot;&gt;Logpush&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/log-explorer/&quot;&gt;Log Explorer&lt;/a&gt; may see increased log volume if they use these on-ramps.&lt;/p&gt;
&lt;p&gt;For field definitions, refer to &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/zero_trust_network_sessions/&quot;&gt;Zero Trust Network Session Logs&lt;/a&gt;. For traffic analysis, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/analytics/network-sessions/&quot;&gt;Network session analytics&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category><category>Cloudflare One</category></item><item><title>Terraform - Terraform v5.19.0 now available</title><link>https://developers.cloudflare.com/changelog/post/2026-04-24-terraform-v5.19.0-provider/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-24-terraform-v5.19.0-provider/</guid><description>&lt;p&gt;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 &lt;a href=&quot;https://github.com/cloudflare/tf-migrate&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;tf-migrate CLI tool&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to automate resource renames, attribute updates, and &lt;code&gt;moved&lt;/code&gt; block generation. Together, these enhancements reduce manual migration effort and minimize risk when upgrading from v4 to v5.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;cmd/migrate&lt;/code&gt; is deprecated in favor of &lt;code&gt;tf-migrate&lt;/code&gt; and will be removed in a future release (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/pull/7062&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#7062&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-resources&quot;&gt;New Resources&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_ai_gateway&lt;/strong&gt;: Manage AI Gateway instances&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_certificate_authorities_hostname_associations&lt;/strong&gt;: Manage mTLS certificate hostname associations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_custom_page_asset&lt;/strong&gt;: Manage custom page assets&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_pipeline&lt;/strong&gt;: Manage Cloudflare Pipelines&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_r2_data_catalog&lt;/strong&gt;: Manage R2 Data Catalog&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_user_group&lt;/strong&gt;: Manage user groups&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_user_group_members&lt;/strong&gt;: Manage user group memberships&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_vulnerability_scanner_credential&lt;/strong&gt;: Manage vulnerability scanner credentials&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_vulnerability_scanner_credential_set&lt;/strong&gt;: Manage vulnerability scanner credential sets&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_vulnerability_scanner_target_environment&lt;/strong&gt;: Manage vulnerability scanner target environments&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_workers_observability_destination&lt;/strong&gt;: Manage Workers Observability destinations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_zero_trust_device_ip_profile&lt;/strong&gt;: Manage Zero Trust device IP profiles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_zero_trust_device_subnet&lt;/strong&gt;: Manage Zero Trust device subnets&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_zero_trust_dlp_settings&lt;/strong&gt;: Manage Zero Trust DLP settings&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;features&quot;&gt;Features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;v4-to-v5-migration-state-upgraders&quot;&gt;V4 to V5 Migration State Upgraders&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#v4-to-v5-migration-state-upgraders&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;State upgraders added for seamless migration from v4 to v5 for the following resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;account&lt;/li&gt;
&lt;li&gt;account_member&lt;/li&gt;
&lt;li&gt;account_token&lt;/li&gt;
&lt;li&gt;authenticated_origin_pulls&lt;/li&gt;
&lt;li&gt;authenticated_origin_pulls_hostname_certificate&lt;/li&gt;
&lt;li&gt;byo_ip_prefix&lt;/li&gt;
&lt;li&gt;custom_hostname&lt;/li&gt;
&lt;li&gt;custom_ssl&lt;/li&gt;
&lt;li&gt;leaked_credential_check&lt;/li&gt;
&lt;li&gt;leaked_credential_check_rule&lt;/li&gt;
&lt;li&gt;logpush_ownership_challenge&lt;/li&gt;
&lt;li&gt;mtls_certificate&lt;/li&gt;
&lt;li&gt;observatory_scheduled_test&lt;/li&gt;
&lt;li&gt;pages_domain&lt;/li&gt;
&lt;li&gt;regional_tiered_cache&lt;/li&gt;
&lt;li&gt;turnstile_widget&lt;/li&gt;
&lt;li&gt;workers_custom_domain&lt;/li&gt;
&lt;li&gt;zero_trust_device_custom_profile&lt;/li&gt;
&lt;li&gt;zero_trust_device_default_profile&lt;/li&gt;
&lt;li&gt;zero_trust_device_posture_integration&lt;/li&gt;
&lt;li&gt;zero_trust_gateway_certificate&lt;/li&gt;
&lt;li&gt;zero_trust_gateway_settings&lt;/li&gt;
&lt;li&gt;zero_trust_organization&lt;/li&gt;
&lt;li&gt;zero_trust_tunnel_cloudflared_virtual_network&lt;/li&gt;
&lt;li&gt;zone_setting&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;other-features&quot;&gt;Other Features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#other-features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ruleset&lt;/strong&gt;: Add &lt;code&gt;content_converter&lt;/code&gt; and &lt;code&gt;redirects_for_ai_training&lt;/code&gt; support to configuration rules&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_gateway_logging&lt;/strong&gt;: Make importable&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;bug-fixes&quot;&gt;Bug Fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bug-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;migration--state-management&quot;&gt;Migration &amp;amp; State Management&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#migration--state-management&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;account_member&lt;/strong&gt;: Add UseStateForUnknown to status field to prevent drift&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;authenticated_origin_pulls_settings&lt;/strong&gt;: Fix no prior schema and no-op upgrade&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;certificate_pack&lt;/strong&gt;: Initialize empty lists instead of null in state upgrader to prevent drift&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;migrations&lt;/strong&gt;: Handle ambiguous schema_version state for v4/v5 coexistence&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_access_policy&lt;/strong&gt;: Fix nil pointer panic in state upgrader; set PriorSchema nil for v4 state upgrade&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;resource-specific-fixes&quot;&gt;Resource-Specific Fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#resource-specific-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ai_search_instance&lt;/strong&gt;: Restore original defaults for cache and cache_threshold; conflict resolution&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;apijson&lt;/strong&gt;: Return empty object from MarshalForPatch when no fields are serializable&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dlp_predefined_profile&lt;/strong&gt;: Eliminate perpetual entries and enabled_entries drift&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dns_record&lt;/strong&gt;: Avoid unnecessary drift for ipv4_only and ipv6_only attributes; remove private_routing default value&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;drift&lt;/strong&gt;: Preserve prior state values for optional fields not returned by API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;healthcheck&lt;/strong&gt;: Use buildHealthcheckPlanChecks helper for correct plan checks per migration source; update assertions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;leaked_credential_check_rule&lt;/strong&gt;: Handle empty ID from v4 provider state migration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;list_item&lt;/strong&gt;: Remove context&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;logpush_job&lt;/strong&gt;: Update model for migration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ruleset&lt;/strong&gt;: Fix migration; add redirects_for_ai_training to SourceV4ActionParametersModel; fix duplicate model attribute&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;worker&lt;/strong&gt;: Add UseStateForUnknown() plan modifiers and update tests for observability.traces&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_custom_domain&lt;/strong&gt;: Handle HTTP 200 no content header; update assertions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_script&lt;/strong&gt;: Fix model drift&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_access_identity_provider&lt;/strong&gt;: Fix boolean drifts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_device_managed_networks&lt;/strong&gt;: Upgrade resource state&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_gateway_policy&lt;/strong&gt;: Make filters Computed+Optional to prevent drift&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_gateway_settings&lt;/strong&gt;: Fix breaking changes; implement sweeper to reset account to clean defaults&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zone_setting&lt;/strong&gt;: Migration test improvements and fixes&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;documentation&quot;&gt;Documentation&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#documentation&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;healthcheck&lt;/strong&gt;: Update port description to clarify defaults&lt;/li&gt;
&lt;li&gt;Add application-scoped access policy migration guidance&lt;/li&gt;
&lt;li&gt;Update zone_settings_override migration guide for tf-migrate v2 workflow&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;for-more-information&quot;&gt;For more information&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#for-more-information&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Terraform Provider&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-migration&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Version 5 Migration Guide&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/terraform/&quot;&gt;Documentation on using Terraform with Cloudflare&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate><product>Terraform</product><category>Terraform</category></item><item><title>Terraform - Automate migration from Cloudflare&apos;s Terraform v4 to v5 provider</title><link>https://developers.cloudflare.com/changelog/post/2026-04-24-tf-migrate-tool-released/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-24-tf-migrate-tool-released/</guid><description>&lt;p&gt;We&apos;re excited to announce &lt;strong&gt;tf-migrate&lt;/strong&gt;, a purpose-built CLI tool that simplifies migrating from Cloudflare Terraform Provider v4 to v5.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;v5-is-stable-and-ready-for-production&quot;&gt;v5 is stable and ready for production&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#v5-is-stable-and-ready-for-production&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Terraform Provider v5 is stable and actively receiving updates.&lt;/strong&gt;  We encourage all users to migrate to v5 to take advantage of ongoing enhancements and new capabilities.&lt;/p&gt;
&lt;p&gt;Cloudflare uses tf-migrate to migrate our own infrastructure — the same tool we&apos;re providing to the community — ensuring the best possible migration experience.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-tf-migrate-does&quot;&gt;What tf-migrate does&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-tf-migrate-does&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;tf-migrate&lt;/strong&gt; automates the tedious and error-prone parts of the v4 to v5 migration process:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resource type renames&lt;/strong&gt; – Automatically updates &lt;code&gt;cloudflare_record&lt;/code&gt; → &lt;code&gt;cloudflare_dns_record&lt;/code&gt;, &lt;code&gt;cloudflare_access_application&lt;/code&gt; → &lt;code&gt;cloudflare_zero_trust_access_application&lt;/code&gt;, and 40+ other renamed resources&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Attribute transformations&lt;/strong&gt; – Updates field names (e.g., &lt;code&gt;value&lt;/code&gt; → &lt;code&gt;content&lt;/code&gt; for DNS records) and restructures nested blocks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Moved block generation&lt;/strong&gt; – Creates Terraform 1.8+ &lt;code&gt;moved&lt;/code&gt; blocks to prevent resource replacements and ensure zero-downtime migrations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross-file reference updates&lt;/strong&gt; – Automatically finds and updates all references to renamed resources across your entire configuration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dry-run mode&lt;/strong&gt; – Preview all changes before applying them to ensure safety&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;supported-resources&quot;&gt;Supported resources&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#supported-resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For the complete list of supported resources and their migration status, refer to the &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v5 Stabilization Tracker&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. This list is updated regularly as additional resources are stabilized and migration support is added.&lt;/p&gt;
&lt;p&gt;Resources not yet supported by tf-migrate will need to be migrated manually using the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-upgrade&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;version 5 upgrade guide&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. The upgrade guide provides step-by-step instructions for handling resource renames, attribute changes, and state migrations.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/tf-migrate/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Download tf-migrate&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/guides/version-5-migration&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Version 5 Migration Guide&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/terraform/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Terraform Provider documentation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v5 Stabilization Tracker&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have been releasing Betas over the past month and a half while testing this tool. See the full changelog of those Betas here: &lt;a href=&quot;https://github.com/cloudflare/tf-migrate/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;tf-migrate releases&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate><product>Terraform</product><category>Terraform</category></item><item><title>Access - AAGUID restrictions and AMR matching for Access independent MFA</title><link>https://developers.cloudflare.com/changelog/post/2026-04-23-independent-mfa-aaguid-amr/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-23-independent-mfa-aaguid-amr/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/independent-mfa/&quot;&gt;Independent MFA&lt;/a&gt; in Cloudflare Access now supports two additional organization-level controls:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/independent-mfa/#restrict-authenticators-by-aaguid&quot;&gt;Restrict authenticators by AAGUID&lt;/a&gt;&lt;/strong&gt; — Limit enrollment to a specific set of WebAuthn authenticators using their &lt;a href=&quot;https://fidoalliance.org/specs/fido-v2.0-id-20180227/fido-registry-v2.0-id-20180227.html#authenticator-attestation-guid&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AAGUID&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. This is useful for organizations that require FIPS-validated security keys or company-issued hardware. AAGUIDs are managed through a new &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/reusable-components/lists/&quot;&gt;List&lt;/a&gt; type.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/independent-mfa/#use-identity-provider-mfa&quot;&gt;AMR matching&lt;/a&gt;&lt;/strong&gt; — Skip the independent MFA prompt when the identity provider has already performed an equivalent MFA. Access reads the &lt;code&gt;amr&lt;/code&gt; claim defined in &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8176&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 8176&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and matches supported values such as &lt;code&gt;hwk&lt;/code&gt;, &lt;code&gt;otp&lt;/code&gt;, and &lt;code&gt;fpt&lt;/code&gt; 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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/independent-mfa/&quot;&gt;Independent MFA&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Audit Logs - Audit Logs v2 — Organization-level support</title><link>https://developers.cloudflare.com/changelog/post/2026-04-23-audit-logs-v2-organization-level/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-23-audit-logs-v2-organization-level/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To retrieve organization-level audit logs, use the following endpoint:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;GET&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/organizations/{organization_id}/logs/audit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/&quot;&gt;Audit Logs documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate><product>Audit Logs</product><category>Audit Logs</category></item><item><title>SDK, Go SDK - Go SDK v6.10.0 Released</title><link>https://developers.cloudflare.com/changelog/post/2026-04-23-go-sdk-v6.10.0/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-23-go-sdk-v6.10.0/</guid><description>&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;v6100&quot;&gt;v6.10.0&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#v6100&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In this release, you&apos;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Please ensure you read through the list of changes below before moving to this version&lt;/strong&gt; - this will help you understand any down or upstream issues it may cause to your environments.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;breaking-changes&quot;&gt;Breaking Changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#breaking-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;See the &lt;a href=&quot;https://github.com/cloudflare/cloudflare-go/blob/main/MIGRATION_GUIDE.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v6.10.0 Migration Guide&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; for before/after code examples and actions needed for each change.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;abuse-reports---registrar-whois-report-field-removals&quot;&gt;Abuse Reports - Registrar WHOIS Report Field Removals&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#abuse-reports---registrar-whois-report-field-removals&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Several fields have been removed from &lt;code&gt;AbuseReportNewParamsBodyAbuseReportsRegistrarWhoisReportRegWhoRequest&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RegWhoGoodFaithAffirmation&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RegWhoLawfulProcessingAgreement&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RegWhoLegalBasis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RegWhoRequestType&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RegWhoRequestedDataElements&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ai-search---instance-params-restructured&quot;&gt;AI Search - Instance Params Restructured&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ai-search---instance-params-restructured&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;InstanceNewParams&lt;/code&gt; and &lt;code&gt;InstanceUpdateParams&lt;/code&gt; types have been significantly restructured. Many fields have been moved or removed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;InstanceNewParams.TokenID&lt;/code&gt;, &lt;code&gt;Type&lt;/code&gt;, &lt;code&gt;CreatedFromAISearchWizard&lt;/code&gt;, &lt;code&gt;WorkerDomain&lt;/code&gt; removed&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InstanceUpdateParams&lt;/code&gt; — most configuration fields removed (including &lt;code&gt;IndexMethod&lt;/code&gt;, &lt;code&gt;IndexingOptions&lt;/code&gt;, &lt;code&gt;MaxNumResults&lt;/code&gt;, &lt;code&gt;Metadata&lt;/code&gt;, &lt;code&gt;Paused&lt;/code&gt;, &lt;code&gt;PublicEndpointParams&lt;/code&gt;, &lt;code&gt;Reranking&lt;/code&gt;, &lt;code&gt;RerankingModel&lt;/code&gt;, &lt;code&gt;RetrievalOptions&lt;/code&gt;, &lt;code&gt;RewriteModel&lt;/code&gt;, &lt;code&gt;RewriteQuery&lt;/code&gt;, &lt;code&gt;ScoreThreshold&lt;/code&gt;, &lt;code&gt;SourceParams&lt;/code&gt;, &lt;code&gt;Summarization&lt;/code&gt;, &lt;code&gt;SummarizationModel&lt;/code&gt;, &lt;code&gt;SystemPromptAISearch&lt;/code&gt;, &lt;code&gt;SystemPromptIndexSummarization&lt;/code&gt;, &lt;code&gt;SystemPromptRewriteQuery&lt;/code&gt;, &lt;code&gt;TokenID&lt;/code&gt;, &lt;code&gt;CreatedFromAISearchWizard&lt;/code&gt;, &lt;code&gt;WorkerDomain&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InstanceSearchParams.Messages&lt;/code&gt; field removed along with &lt;code&gt;InstanceSearchParamsMessage&lt;/code&gt; and &lt;code&gt;InstanceSearchParamsMessagesRole&lt;/code&gt; types&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ai-search---instanceitem-service-removed&quot;&gt;AI Search - InstanceItem Service Removed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ai-search---instanceitem-service-removed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;InstanceItemService&lt;/code&gt; type has been removed. The items sub-resource at &lt;code&gt;client.AISearch.Instances.Items&lt;/code&gt; no longer exists in the non-namespace path. Use &lt;code&gt;client.AISearch.Namespaces.Instances.Items&lt;/code&gt; instead.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ai-search---token-types-removed&quot;&gt;AI Search - Token Types Removed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ai-search---token-types-removed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The following types have been removed from the &lt;code&gt;ai_search&lt;/code&gt; package:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TokenDeleteResponse&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TokenListParams&lt;/code&gt; (and associated &lt;code&gt;TokenListParamsOrderBy&lt;/code&gt;, &lt;code&gt;TokenListParamsOrderByDirection&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;email-security---investigate-move-return-type-change&quot;&gt;Email Security - Investigate Move Return Type Change&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#email-security---investigate-move-return-type-change&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;Investigate.Move.New()&lt;/code&gt; method now returns a raw slice instead of a paginated wrapper:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;New()&lt;/code&gt; returns &lt;code&gt;*[]InvestigateMoveNewResponse&lt;/code&gt; instead of &lt;code&gt;*pagination.SinglePage[InvestigateMoveNewResponse]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NewAutoPaging()&lt;/code&gt; method removed&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;hyperdrive---config-params-restructured&quot;&gt;Hyperdrive - Config Params Restructured&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#hyperdrive---config-params-restructured&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;ConfigEditParams&lt;/code&gt; type lost its &lt;code&gt;MTLS&lt;/code&gt; and &lt;code&gt;Name&lt;/code&gt; fields. The &lt;code&gt;HyperdriveMTLSParam&lt;/code&gt; type lost &lt;code&gt;MTLS&lt;/code&gt; and &lt;code&gt;Host&lt;/code&gt; fields. The &lt;code&gt;Host&lt;/code&gt; field on origin config changed from &lt;code&gt;param.Field[string]&lt;/code&gt; to a plain &lt;code&gt;string&lt;/code&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;iam---usergroupmember-params-and-return-types-changed&quot;&gt;IAM - UserGroupMember Params and Return Types Changed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#iam---usergroupmember-params-and-return-types-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;UserGroupMemberNewParams&lt;/code&gt; struct has been restructured and the &lt;code&gt;New()&lt;/code&gt; method now returns a paginated response:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;UserGroupMemberNewParams.Body&lt;/code&gt; renamed to &lt;code&gt;UserGroupMemberNewParams.Members&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UserGroupMemberNewParamsBody&lt;/code&gt; renamed to &lt;code&gt;UserGroupMemberNewParamsMember&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UserGroupMemberUpdateParams.Body&lt;/code&gt; renamed to &lt;code&gt;UserGroupMemberUpdateParams.Members&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UserGroupMemberUpdateParamsBody&lt;/code&gt; renamed to &lt;code&gt;UserGroupMemberUpdateParamsMember&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UserGroups.Members.New()&lt;/code&gt; returns &lt;code&gt;*pagination.SinglePage[UserGroupMemberNewResponse]&lt;/code&gt; instead of &lt;code&gt;*UserGroupMemberNewResponse&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;iam---usergroup-list-direction-type-changed&quot;&gt;IAM - UserGroup List Direction Type Changed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#iam---usergroup-list-direction-type-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;UserGroupListParams.Direction&lt;/code&gt; field changed from &lt;code&gt;param.Field[string]&lt;/code&gt; to &lt;code&gt;param.Field[UserGroupListParamsDirection]&lt;/code&gt; (typed enum with &lt;code&gt;asc&lt;/code&gt;/&lt;code&gt;desc&lt;/code&gt; values).&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;pipelines---delete-methods-now-return-typed-responses&quot;&gt;Pipelines - Delete Methods Now Return Typed Responses&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#pipelines---delete-methods-now-return-typed-responses&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Several delete methods across Pipelines now return typed responses instead of bare error:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Pipelines.DeleteV1()&lt;/code&gt; returns &lt;code&gt;(*PipelineDeleteV1Response, error)&lt;/code&gt; instead of &lt;code&gt;error&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pipelines.Sinks.Delete()&lt;/code&gt; returns &lt;code&gt;(*SinkDeleteResponse, error)&lt;/code&gt; instead of &lt;code&gt;error&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pipelines.Streams.Delete()&lt;/code&gt; returns &lt;code&gt;(*StreamDeleteResponse, error)&lt;/code&gt; instead of &lt;code&gt;error&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;queues---message-response-types-removed&quot;&gt;Queues - Message Response Types Removed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#queues---message-response-types-removed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The following response envelope types have been removed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MessageBulkPushResponseSuccess&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MessagePushResponseSuccess&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MessageAckResponse&lt;/code&gt; fields &lt;code&gt;RetryCount&lt;/code&gt; and &lt;code&gt;Warnings&lt;/code&gt; removed&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;secrets-store---pagination-wrapper-removal-and-type-changes&quot;&gt;Secrets Store - Pagination Wrapper Removal and Type Changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#secrets-store---pagination-wrapper-removal-and-type-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Methods now return direct types instead of &lt;code&gt;SinglePage&lt;/code&gt; wrappers, and several internal types have been removed. Associated &lt;code&gt;AutoPaging&lt;/code&gt; methods have also been removed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Stores.New()&lt;/code&gt; returns &lt;code&gt;*StoreNewResponse&lt;/code&gt; instead of &lt;code&gt;*pagination.SinglePage[StoreNewResponse]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Stores.NewAutoPaging()&lt;/code&gt; method removed&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Stores.Secrets.BulkDelete()&lt;/code&gt; returns &lt;code&gt;*StoreSecretBulkDeleteResponse&lt;/code&gt; instead of &lt;code&gt;*pagination.SinglePage[StoreSecretBulkDeleteResponse]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Stores.Secrets.BulkDeleteAutoPaging()&lt;/code&gt; method removed&lt;/li&gt;
&lt;li&gt;Removed types: &lt;code&gt;StoreDeleteResponse&lt;/code&gt;, &lt;code&gt;StoreDeleteResponseEnvelopeResultInfo&lt;/code&gt;, &lt;code&gt;StoreSecretDeleteResponse&lt;/code&gt;, &lt;code&gt;StoreSecretDeleteResponseStatus&lt;/code&gt;, &lt;code&gt;StoreSecretBulkDeleteResponse&lt;/code&gt; (old shape), &lt;code&gt;StoreSecretBulkDeleteResponseStatus&lt;/code&gt;, &lt;code&gt;StoreSecretDeleteResponseEnvelopeResultInfo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;StoreNewParams&lt;/code&gt; restructured (old &lt;code&gt;StoreNewParamsBody&lt;/code&gt; removed)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;StoreSecretBulkDeleteParams&lt;/code&gt; restructured&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;stream---audiotracks-return-type-change&quot;&gt;Stream - AudioTracks Return Type Change&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#stream---audiotracks-return-type-change&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;AudioTracks.Get()&lt;/code&gt; method now returns a dedicated response type instead of a paginated list. The &lt;code&gt;GetAutoPaging()&lt;/code&gt; method has been removed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Get()&lt;/code&gt; returns &lt;code&gt;*AudioTrackGetResponse&lt;/code&gt; instead of &lt;code&gt;*pagination.SinglePage[Audio]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GetAutoPaging()&lt;/code&gt; method removed&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;stream---clip-type-removal-and-return-type-change&quot;&gt;Stream - Clip Type Removal and Return Type Change&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#stream---clip-type-removal-and-return-type-change&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;Clip.New()&lt;/code&gt; method now returns the shared &lt;code&gt;Video&lt;/code&gt; type. The following types have been entirely removed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Clip&lt;/code&gt;, &lt;code&gt;ClipPlayback&lt;/code&gt;, &lt;code&gt;ClipStatus&lt;/code&gt;, &lt;code&gt;ClipWatermark&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;stream---copy-and-clip-params-field-removals&quot;&gt;Stream - Copy and Clip Params Field Removals&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#stream---copy-and-clip-params-field-removals&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ClipNewParams.MaxDurationSeconds&lt;/code&gt;, &lt;code&gt;ThumbnailTimestampPct&lt;/code&gt;, &lt;code&gt;Watermark&lt;/code&gt; removed&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CopyNewParams.ThumbnailTimestampPct&lt;/code&gt;, &lt;code&gt;Watermark&lt;/code&gt; removed&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;stream---download-and-webhook-changes&quot;&gt;Stream - Download and Webhook Changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#stream---download-and-webhook-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DownloadNewResponseStatus&lt;/code&gt; type removed&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WebhookUpdateResponse&lt;/code&gt; and &lt;code&gt;WebhookGetResponse&lt;/code&gt; changed from &lt;code&gt;interface{}&lt;/code&gt; type aliases to full struct types&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;zero-trust---access-ai-control-mcp-portal-union-types-removed&quot;&gt;Zero Trust - Access AI Control MCP Portal Union Types Removed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#zero-trust---access-ai-control-mcp-portal-union-types-removed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The following union interface types have been removed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AccessAIControlMcpPortalListResponseServersUpdatedPromptsUnion&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AccessAIControlMcpPortalListResponseServersUpdatedToolsUnion&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AccessAIControlMcpPortalReadResponseServersUpdatedPromptsUnion&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AccessAIControlMcpPortalReadResponseServersUpdatedToolsUnion&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;features&quot;&gt;Features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;vulnerability-scanner-clientvulnerabilityscanner&quot;&gt;Vulnerability Scanner (&lt;code&gt;client.VulnerabilityScanner&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#vulnerability-scanner-clientvulnerabilityscanner&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;NEW SERVICE:&lt;/strong&gt; Full vulnerability scanning management&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CredentialSets&lt;/strong&gt; - CRUD for credential sets (&lt;code&gt;New&lt;/code&gt;, &lt;code&gt;Update&lt;/code&gt;, &lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Delete&lt;/code&gt;, &lt;code&gt;Edit&lt;/code&gt;, &lt;code&gt;Get&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Credentials&lt;/strong&gt; - Manage credentials within sets (&lt;code&gt;New&lt;/code&gt;, &lt;code&gt;Update&lt;/code&gt;, &lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Delete&lt;/code&gt;, &lt;code&gt;Edit&lt;/code&gt;, &lt;code&gt;Get&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scans&lt;/strong&gt; - Create and manage vulnerability scans (&lt;code&gt;New&lt;/code&gt;, &lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Get&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TargetEnvironments&lt;/strong&gt; - Manage scan target environments (&lt;code&gt;New&lt;/code&gt;, &lt;code&gt;Update&lt;/code&gt;, &lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Delete&lt;/code&gt;, &lt;code&gt;Edit&lt;/code&gt;, &lt;code&gt;Get&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ai-search---namespaces-clientaisearchnamespaces&quot;&gt;AI Search - Namespaces (&lt;code&gt;client.AISearch.Namespaces&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ai-search---namespaces-clientaisearchnamespaces&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;NEW SERVICE:&lt;/strong&gt; Namespace-scoped AI Search management&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;New()&lt;/code&gt;, &lt;code&gt;Update()&lt;/code&gt;, &lt;code&gt;List()&lt;/code&gt;, &lt;code&gt;Delete()&lt;/code&gt;, &lt;code&gt;ChatCompletions()&lt;/code&gt;, &lt;code&gt;Read()&lt;/code&gt;, &lt;code&gt;Search()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instances&lt;/strong&gt; - Namespace-scoped instances (&lt;code&gt;New&lt;/code&gt;, &lt;code&gt;Update&lt;/code&gt;, &lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Delete&lt;/code&gt;, &lt;code&gt;ChatCompletions&lt;/code&gt;, &lt;code&gt;Read&lt;/code&gt;, &lt;code&gt;Search&lt;/code&gt;, &lt;code&gt;Stats&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jobs&lt;/strong&gt; - Instance job management (&lt;code&gt;New&lt;/code&gt;, &lt;code&gt;Update&lt;/code&gt;, &lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Get&lt;/code&gt;, &lt;code&gt;Logs&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Items&lt;/strong&gt; - Instance item management (&lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Delete&lt;/code&gt;, &lt;code&gt;Chunks&lt;/code&gt;, &lt;code&gt;NewOrUpdate&lt;/code&gt;, &lt;code&gt;Download&lt;/code&gt;, &lt;code&gt;Get&lt;/code&gt;, &lt;code&gt;Logs&lt;/code&gt;, &lt;code&gt;Sync&lt;/code&gt;, &lt;code&gt;Upload&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;browser-rendering---devtools-clientbrowserrenderingdevtools&quot;&gt;Browser Rendering - Devtools (&lt;code&gt;client.BrowserRendering.Devtools&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#browser-rendering---devtools-clientbrowserrenderingdevtools&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;NEW SERVICE:&lt;/strong&gt; DevTools protocol browser control&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Session&lt;/strong&gt; - List and get devtools sessions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Browser&lt;/strong&gt; - Browser lifecycle management (&lt;code&gt;New&lt;/code&gt;, &lt;code&gt;Delete&lt;/code&gt;, &lt;code&gt;Connect&lt;/code&gt;, &lt;code&gt;Launch&lt;/code&gt;, &lt;code&gt;Protocol&lt;/code&gt;, &lt;code&gt;Version&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Page&lt;/strong&gt; - Get page by target ID&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Targets&lt;/strong&gt; - Manage browser targets (&lt;code&gt;New&lt;/code&gt;, &lt;code&gt;List&lt;/code&gt;, &lt;code&gt;Activate&lt;/code&gt;, &lt;code&gt;Get&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;registrar-clientregistrar&quot;&gt;Registrar (&lt;code&gt;client.Registrar&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#registrar-clientregistrar&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;NEW:&lt;/strong&gt; Domain check and search endpoints&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Check()&lt;/code&gt; - &lt;code&gt;POST /accounts/{account_id}/registrar/domain-check&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Search()&lt;/code&gt; - &lt;code&gt;GET /accounts/{account_id}/registrar/domain-search&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;NEW:&lt;/strong&gt; Registration management (&lt;code&gt;client.Registrar.Registrations&lt;/code&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;New()&lt;/code&gt;, &lt;code&gt;List()&lt;/code&gt;, &lt;code&gt;Edit()&lt;/code&gt;, &lt;code&gt;Get()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RegistrationStatus.Get()&lt;/code&gt; - Get registration workflow status&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UpdateStatus.Get()&lt;/code&gt; - Get update workflow status&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cache---origin-cloud-regions-clientcacheorigincloudregions&quot;&gt;Cache - Origin Cloud Regions (&lt;code&gt;client.Cache.OriginCloudRegions&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cache---origin-cloud-regions-clientcacheorigincloudregions&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;NEW SERVICE:&lt;/strong&gt; Manage origin cloud region configurations&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;New()&lt;/code&gt;, &lt;code&gt;List()&lt;/code&gt;, &lt;code&gt;Delete()&lt;/code&gt;, &lt;code&gt;BulkDelete()&lt;/code&gt;, &lt;code&gt;BulkEdit()&lt;/code&gt;, &lt;code&gt;Edit()&lt;/code&gt;, &lt;code&gt;Get()&lt;/code&gt;, &lt;code&gt;SupportedRegions()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;zero-trust---dlp-settings-clientzerotrustdlpsettings&quot;&gt;Zero Trust - DLP Settings (&lt;code&gt;client.ZeroTrust.DLP.Settings&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#zero-trust---dlp-settings-clientzerotrustdlpsettings&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;NEW SERVICE:&lt;/strong&gt; DLP settings management&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Update()&lt;/code&gt;, &lt;code&gt;Delete()&lt;/code&gt;, &lt;code&gt;Edit()&lt;/code&gt;, &lt;code&gt;Get()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;radar&quot;&gt;Radar&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#radar&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AgentReadiness.Summary()&lt;/code&gt; - Agent readiness summary by dimension&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AI.MarkdownForAgents.Summary()&lt;/code&gt; - Markdown-for-agents summary&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AI.MarkdownForAgents.Timeseries()&lt;/code&gt; - Markdown-for-agents timeseries&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;iam-clientiam&quot;&gt;IAM (&lt;code&gt;client.IAM&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#iam-clientiam&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;UserGroups.Members.Get()&lt;/code&gt; - Get details of a specific member in a user group&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UserGroups.Members.NewAutoPaging()&lt;/code&gt; - Auto-paging variant for adding members&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UserGroups.NewParams.Policies&lt;/code&gt; changed from required to optional&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;bot-management&quot;&gt;Bot Management&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bot-management&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ContentBotsProtection&lt;/code&gt; field added to &lt;code&gt;BotFightModeConfiguration&lt;/code&gt; and &lt;code&gt;SubscriptionConfiguration&lt;/code&gt; (&lt;code&gt;block&lt;/code&gt;/&lt;code&gt;disabled&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;deprecations&quot;&gt;Deprecations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#deprecations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;None in this release.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/cloudflare-go/releases/tag/v6.10.0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Download Go SDK v6.10.0&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/sdks/go/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Go SDK documentation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/cloudflare-go/blob/main/MIGRATION_GUIDE.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Migration Guide&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate><product>SDK</product><category>SDK</category><category>Go SDK</category></item><item><title>Analytics, Log Explorer - Custom dashboards available to all customers</title><link>https://developers.cloudflare.com/changelog/post/2026-04-22-custom-dashboards-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-22-custom-dashboards-ga/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;This update significantly expands the data available for visualization. Build charts based on any of the &lt;strong&gt;100+ datasets&lt;/strong&gt; available via the Cloudflare GraphQL API, covering everything from WAF events and Workers metrics to Load Balancing and Zero Trust logs.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;log-explorer-integration&quot;&gt;Log Explorer integration&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#log-explorer-integration&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-benefits&quot;&gt;Key benefits&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-benefits&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unified visibility&lt;/strong&gt;: Consolidate signals from different Cloudflare products (for example, HTTP Traffic and R2 Storage) into a single view.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexible monitoring&lt;/strong&gt;: Create charts that focus on specific status codes, ASN regions, or security actions that matter to your business.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expanded limits&lt;/strong&gt;: Log Explorer customers can create up to &lt;strong&gt;100 dashboards&lt;/strong&gt; (up from 25 for standard customers).&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1079,height=793,format=webp/_astro/customdashboardshome.BIpSvImM.jpg&quot; alt=&quot;Custom Dashboards home page showing dashboard list and chart previews&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1079&quot; height=&quot;793&quot;&gt;
&lt;p&gt;To get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/analytics/custom-dashboards/&quot;&gt;Custom Dashboards documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate><product>Analytics</product><category>Analytics</category><category>Log Explorer</category></item><item><title>R2, R2 Data Catalog - R2 Data Catalog snapshot expiration now removes unreferenced data files</title><link>https://developers.cloudflare.com/changelog/post/2026-04-22-snapshot-expiration-cleans-data-files/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-22-snapshot-expiration-cleans-data-files/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;, a managed &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;remove_orphan_files&lt;/code&gt; or &lt;code&gt;expire_snapshots&lt;/code&gt; through an engine like Spark. This required extra operational overhead and left stale data files consuming storage.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Enable catalog-level snapshot expiration&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; bucket&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; catalog&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; snapshot-expiration&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; enable&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-bucket&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --older-than-days&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 7&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --retain-last&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/table-maintenance/&quot;&gt;table maintenance documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category><category>R2 Data Catalog</category></item><item><title>Cloudflare Network Firewall, Magic Transit, Cloudflare WAN - Country rules supported in Unified Routing</title><link>https://developers.cloudflare.com/changelog/post/2026-04-21-unified-routing-geoip-country-rules/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-21-unified-routing-geoip-country-rules/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-network-firewall/&quot;&gt;Cloudflare Advanced Network Firewall&lt;/a&gt; Country rules are now supported for accounts using &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/reference/traffic-steering/#unified-routing-mode-beta&quot;&gt;Unified Routing&lt;/a&gt; mode. This feature requires a Cloudflare Advanced Network Firewall subscription.&lt;/p&gt;
&lt;p&gt;You can create firewall rules that match traffic based on source or destination country to enforce geographic access policies across your network.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For the full list of current beta limitations, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/reference/traffic-steering/#beta-limitations&quot;&gt;Traffic steering beta limitations&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 21 Apr 2026 12:00:00 GMT</pubDate><product>Cloudflare Network Firewall</product><category>Cloudflare Network Firewall</category><category>Magic Transit</category><category>Cloudflare WAN</category></item><item><title>Cloudflare Fundamentals - Network Overview page in the dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-04-21-network-overview-page/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-21-network-overview-page/</guid><description>&lt;p&gt;A new &lt;strong&gt;Network Overview&lt;/strong&gt; page in the Cloudflare dashboard gives you a single starting point for network security and connectivity products.&lt;/p&gt;
&lt;p&gt;From the Network Overview page, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Connect resources with &lt;a href=&quot;https://developers.cloudflare.com/tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt;&lt;/strong&gt; - Create tunnels to connect your infrastructure to Cloudflare without exposing it to the public Internet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitor traffic with Network Flow&lt;/strong&gt; - Get real-time visibility into traffic volume from your routers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configure Address Maps&lt;/strong&gt; - Map dedicated static IPs or BYOIP prefixes to specific hostnames.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explore Magic Transit and Cloudflare WAN&lt;/strong&gt; - Set up DDoS protection for your networks and connectivity for your branch offices and data centers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To find it, go to &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/magic-networks/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Networking&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; in the dashboard sidebar.&lt;/p&gt;
&lt;p&gt;If you already use &lt;a href=&quot;https://developers.cloudflare.com/magic-transit/&quot;&gt;Magic Transit&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/&quot;&gt;Cloudflare WAN&lt;/a&gt;, or other Cloudflare network services products, your existing experience is unchanged.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1650,height=1362,format=webp/_astro/network-overview.4FLDtULW.png&quot; alt=&quot;Network Overview page in the Cloudflare dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1650&quot; height=&quot;1362&quot;&gt;</description><pubDate>Tue, 21 Apr 2026 12:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Workflows - Additional step context and ReadableStream support now available in Workflows step.do()</title><link>https://developers.cloudflare.com/changelog/post/2026-04-21-step-context-and-readable-streams/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-21-step-context-and-readable-streams/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt; now provides additional context inside &lt;code&gt;step.do()&lt;/code&gt; callbacks and supports returning &lt;code&gt;ReadableStream&lt;/code&gt; to handle larger step outputs.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;step-context-properties&quot;&gt;Step context properties&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#step-context-properties&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;step.do()&lt;/code&gt; callback receives a context object with new properties &lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-03-06-step-context-available/&quot;&gt;alongside&lt;/a&gt; &lt;code&gt;attempt&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;step.name&lt;/code&gt;&lt;/strong&gt; — The name passed to &lt;code&gt;step.do()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;step.count&lt;/code&gt;&lt;/strong&gt; — How many times a step with that name has been invoked in this instance (1-indexed)
&lt;ul&gt;
&lt;li&gt;Useful when running the same step in a loop.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;config&lt;/code&gt;&lt;/strong&gt; — The resolved step configuration, including &lt;code&gt;timeout&lt;/code&gt; and &lt;code&gt;retries&lt;/code&gt; with defaults applied&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ResolvedStepConfig&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	retries&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		limit&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		delay&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowDelayDuration&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		backoff&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;?:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;constant&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;linear&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;exponential&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	timeout&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowTimeoutDuration&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkflowStepContext&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	step&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		count&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	attempt&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	config&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ResolvedStepConfig&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;readablestream-support-in-stepdo&quot;&gt;ReadableStream support in &lt;code&gt;step.do()&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#readablestream-support-in-stepdo&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Steps can now return a &lt;code&gt;ReadableStream&lt;/code&gt; directly. Although non-stream step outputs are &lt;a href=&quot;https://developers.cloudflare.com/workflows/reference/limits/&quot;&gt;limited to 1 MiB&lt;/a&gt;, streamed outputs support much larger payloads.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; largePayload&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;fetch-large-file&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; object&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_BUCKET&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;large-file.bin&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; object.body;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Note that streamed outputs are still considered part of the Workflow instance storage limit.&lt;/p&gt;</description><pubDate>Tue, 21 Apr 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category></item><item><title>Containers - Container logs page now includes relevant Worker and Durable Object logs</title><link>https://developers.cloudflare.com/changelog/post/2026-04-21-correlated-worker-durable-object-logs/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-21-correlated-worker-durable-object-logs/</guid><description>&lt;p&gt;The Container logs page now displays related &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Worker&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Object&lt;/a&gt; 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1682,height=926,format=webp/_astro/container-worker-logs.BBQ7NRse.png&quot; alt=&quot;Container logs page showing Worker and Durable Object logs alongside container logs&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1682&quot; height=&quot;926&quot;&gt;
&lt;p&gt;You can filter to a single source when you need to isolate Container, Worker, or Durable Object output.&lt;/p&gt;
&lt;p&gt;For information on configuring container logging, refer to &lt;a href=&quot;https://developers.cloudflare.com/containers/faq/#how-do-container-logs-work&quot;&gt;How do Container logs work?&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Cloudflare Fundamentals, Workers - Introducing Billable Usage dashboard and Budget alerts</title><link>https://developers.cloudflare.com/changelog/post/2026-04-13-billable-usage-dashboard-and-budget-alerts/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-13-billable-usage-dashboard-and-budget-alerts/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;billable-usage-dashboard&quot;&gt;Billable Usage dashboard&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#billable-usage-dashboard&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The dashboard displays:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A bar chart showing daily usage charges for your billing period&lt;/li&gt;
&lt;li&gt;A sortable table breaking down usage by product, including total usage, billable usage, and cumulative costs&lt;/li&gt;
&lt;li&gt;Ability to view previous billing periods&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To access the dashboard, go to &lt;strong&gt;Manage Account&lt;/strong&gt; &amp;gt; &lt;strong&gt;Billing&lt;/strong&gt; &amp;gt; &lt;strong&gt;Billable Usage&lt;/strong&gt;.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1033,height=757,format=webp/_astro/billable-usage-dashboard.CQvMdtrp.png&quot; alt=&quot;Screenshot of the Billable Usage dashboard in the Cloudflare dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1033&quot; height=&quot;757&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;budget-alerts&quot;&gt;Budget alerts&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#budget-alerts&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To configure a budget alert:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Manage Account&lt;/strong&gt; &amp;gt; &lt;strong&gt;Billing&lt;/strong&gt; &amp;gt; &lt;strong&gt;Billable Usage&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Set Budget Alert&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter a budget threshold amount greater than $0.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Alternatively, configure alerts via &lt;strong&gt;Notifications&lt;/strong&gt; &amp;gt; &lt;strong&gt;Add&lt;/strong&gt; &amp;gt; &lt;strong&gt;Budget Alert&lt;/strong&gt;.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=315,height=374,format=webp/_astro/budget-alert-modal.BjIzGOLV.png&quot; alt=&quot;Create Budget Alert modal in the Cloudflare dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;315&quot; height=&quot;374&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Both features are available to Pay-as-you-go accounts with usage-based products (Workers, R2, Images, etc.). Enterprise contract accounts are not supported.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/billing/understand/usage-based-billing/&quot;&gt;Usage based billing documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>Workers</category></item><item><title>Logs - Logpush subrequest merging for HTTP requests</title><link>https://developers.cloudflare.com/changelog/post/2026-04-21-logpush-subrequests-merging/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-21-logpush-subrequests-merging/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;New subrequest_merging field on Logpush jobs — Set &quot;merge_subrequests&quot;: true when creating or updating an http_requests Logpush job to enable the feature.&lt;/li&gt;
&lt;li&gt;New Subrequests log field — When subrequest merging is enabled, a Subrequests field (&lt;code&gt;array\&amp;lt;object\&amp;gt;&lt;/code&gt;) is added to each parent request log record. Each element in the array contains the standard http_requests fields for that subrequest.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;limitations&quot;&gt;Limitations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#limitations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Applies to the http_requests (zone-scoped) dataset only.&lt;/li&gt;
&lt;li&gt;A maximum of 50 subrequests are merged per parent request. Subrequests beyond this limit are passed through unmodified as individual log entries.&lt;/li&gt;
&lt;li&gt;Subrequests must complete within 5 minutes of the visitor request. Subrequests that exceed this window are passed through unmodified.&lt;/li&gt;
&lt;li&gt;Subrequests that do not qualify appear as separate log entries — no data is lost.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/subrequests/&quot;&gt;Subrequests&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>WAF - WAF Release - 2026-04-21</title><link>https://developers.cloudflare.com/changelog/post/2026-04-21-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-21-waf-release/</guid><description>
&lt;p&gt;This week&apos;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Magento 2 - Unrestricted File Upload - 2: This is a follow-up enhancement to our existing protections for Magento and Adobe Commerce.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Continuous Rule Improvements&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ff8df24181aa4573a81be531ee159e2e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ee159e2e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Command Injection - Generic 8 - uri&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection. Previous description was &quot;Command Injection - Generic 8 - uri - Beta&quot;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;9429b63c137247faadeb8a29a15308cf&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...a15308cf&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Command Injection - Generic 8 - body - Beta&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;Command Injection - Generic 8 - body&quot; (ID: &lt;rule-id id=&quot;5b3ce84c099040c6a25cee2d413592e2&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...413592e2&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;). The rule previously known as &quot;Command Injection - Generic 8&quot; is now renamed to &quot;Command Injection - Generic 8 - body&quot;.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;85aaf5db9e0c4237b87e837e958047ed&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...958047ed&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;MySQL - SQLi - Executable Comment - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;MySQL - SQLi - Executable Comment - Body&quot; (ID: &lt;rule-id id=&quot;8629bb58defe4193ab4d493c7bd2d8fa&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...7bd2d8fa&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;) The rule previously known as &quot;MySQL - SQLi - Executable Comment&quot; is now renamed to &quot;MySQL - SQLi - Executable Comment - Body&quot;.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;d19cd574c4644952881a6f3a582cc559&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...582cc559&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;MySQL - SQLi - Executable Comment - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;407f9ec8a17348dfba3b9450a16639d3&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...a16639d3&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;MySQL - SQLi - Executable Comment - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;d07e6dbf15664b99b37b0d2544f24211&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...44f24211&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Magento 2 - Unrestricted file upload - 2&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;26ef21cb197b44fc8a98b7cebf170a17&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...bf170a17&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Apache ActiveMQ - Remote Code Execution - CVE:CVE-2026-34197&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;7f7bc3d28a8e43bf97bd15d68c2ac1a7&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8c2ac1a7&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Sleep Function - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;SQLi - Sleep Function&quot; (ID: &lt;rule-id id=&quot;2c333735f7b24566b17cb64ef77e8d54&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...f77e8d54&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;3872e5638bdf4bf0943a80394dacaeb8&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...4dacaeb8&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Sleep Function - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;bebce8fadfa94ccab09eb74fed4c9ece&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ed4c9ece&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Sleep Function - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;7a40eed5a8654a50a2598a821dfa64df&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1dfa64df&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Probing - uri&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;15c6b2ce033949b2a1a9f9454c62e2e7&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...4c62e2e7&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Probing - header&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;fc9d800b7a724181af8d5650aab28ea1&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...aab28ea1&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Probing - body&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection. This rule is merged into the original rule
&quot;SQLi - Probing&quot; (ID: &lt;rule-id id=&quot;2c20b5e8684043f48620ff77b4026c88&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...b4026c88&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;945c5aa9f45141dd872d7ec920999be0&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...20999be0&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Probing 2 &lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This rule had duplicate detection logic and has been deprecated.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;f1771273700342758e73cf16d7aa0008&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d7aa0008&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - UNION in MSSQL - Body&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This rule has been renamed to differentiate from &quot;SQLi - UNION in MSSQL&quot; (ID: &lt;rule-id id=&quot;ef7db598c7654c729d9db56fee5e35fd&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ee5e35fd&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;) and contains updated rule logic.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;3ffd242b4ba242ca965022d3a67d8561&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...a67d8561&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - UNION - 3&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This rule had duplicate detection logic and has been deprecated.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;5e69d599ad634c81abe36a5f0af34bba&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...0af34bba&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XSS, HTML Injection - Embed Tag  - URI&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;2635275641bf44d4bad6a2e170282f38&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...70282f38&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XSS, HTML Injection - Embed Tag - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;b3d033ea9f364574b0a2ec4223f4d718&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...23f4d718&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XSS, HTML Injection - IFrame Tag - Src and Srcdoc Attributes - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;76c37816ef5c4997ab2080a36978def1&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...6978def1&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XSS, HTML Injection - Link Tag - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;7d6757e8a28f4853a72b4ce6ebd81645&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ebd81645&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XSS, HTML Injection - Link Tag - URI&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;&lt;p&gt;This is a new detection.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - WebSocket binary messages now delivered as Blob by default</title><link>https://developers.cloudflare.com/changelog/post/2026-04-21-websocket-standard-binary-type/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-21-websocket-standard-binary-type/</guid><description>&lt;p&gt;Binary frames received on a &lt;code&gt;WebSocket&lt;/code&gt; are now delivered to the &lt;code&gt;message&lt;/code&gt; event as &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Blob&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;Blob&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; objects by default. This matches the &lt;a href=&quot;https://websockets.spec.whatwg.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WebSocket specification&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and standard browser behavior. Previously, binary frames were always delivered as &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;ArrayBuffer&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. The &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/websockets/#binarytype&quot;&gt;&lt;code&gt;binaryType&lt;/code&gt;&lt;/a&gt; property on &lt;code&gt;WebSocket&lt;/code&gt; controls the delivery type on a per-WebSocket basis.&lt;/p&gt;
&lt;p&gt;This change has been active for Workers with compatibility dates on or after &lt;code&gt;2026-03-17&lt;/code&gt;, via the &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/compatibility-flags/#websocket-standard-binary-type&quot;&gt;&lt;code&gt;websocket_standard_binary_type&lt;/code&gt;&lt;/a&gt; compatibility flag. We should have documented this change when it shipped but didn&apos;t. We&apos;re sorry for the trouble that caused. If your Worker handles binary WebSocket messages and assumes &lt;code&gt;event.data&lt;/code&gt; is an &lt;code&gt;ArrayBuffer&lt;/code&gt;, the frames will arrive as &lt;code&gt;Blob&lt;/code&gt; instead, and a naive &lt;code&gt;instanceof ArrayBuffer&lt;/code&gt; check will silently drop every frame.&lt;/p&gt;
&lt;p&gt;To opt back into &lt;code&gt;ArrayBuffer&lt;/code&gt; delivery, assign &lt;code&gt;binaryType&lt;/code&gt; before calling &lt;code&gt;accept()&lt;/code&gt;. This works regardless of the compatibility flag:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; resp&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	headers: { Upgrade: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;websocket&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; ws&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; resp.webSocket;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Opt back into ArrayBuffer delivery for this WebSocket.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ws.binaryType &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;arraybuffer&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ws.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;accept&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ws.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;message&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;typeof&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; event.data &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Text frame.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// event.data is an ArrayBuffer because we set binaryType above.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;If you are not ready to migrate and want to keep &lt;code&gt;ArrayBuffer&lt;/code&gt; as the default for all WebSockets in your Worker, add the &lt;code&gt;no_websocket_standard_binary_type&lt;/code&gt; flag to your &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/&quot;&gt;Wrangler configuration file&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This change has no effect on the Durable Object hibernatable WebSocket &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/best-practices/websockets/&quot;&gt;&lt;code&gt;webSocketMessage&lt;/code&gt;&lt;/a&gt; handler, which continues to receive binary data as &lt;code&gt;ArrayBuffer&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/websockets/#binary-messages&quot;&gt;WebSockets binary messages&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare One, Gateway - Network session analytics dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-04-20-network-session-analytics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-20-network-session-analytics/</guid><description>&lt;p&gt;The new &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/analytics/network-sessions/&quot;&gt;Network session analytics&lt;/a&gt; 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2926,height=1574,format=webp/_astro/cf1-network-session-analytics.Gl90hEcp.png&quot; alt=&quot;Cloudflare One Network Session Analytics&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2926&quot; height=&quot;1574&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-you-can-do-with-network-session-analytics&quot;&gt;What you can do with Network session analytics&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-you-can-do-with-network-session-analytics&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Analyze geographic distribution&lt;/strong&gt;: View a world map showing where your network traffic originates, with a list of top locations by session count.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monitor key metrics&lt;/strong&gt;: Track session count, total bytes transferred, and unique users.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Identify connection issues&lt;/strong&gt;: Analyze connection close reasons to troubleshoot network problems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review protocol usage&lt;/strong&gt;: See which network protocols (TCP, UDP, ICMP) are most used.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;dashboard-features&quot;&gt;Dashboard features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#dashboard-features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Summary metrics&lt;/strong&gt;: Session count, bytes total, and unique users&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traffic by location&lt;/strong&gt;: World map visualization and location list with top traffic sources&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Top protocols&lt;/strong&gt;: Breakdown of TCP, UDP, ICMP, and ICMPv6 traffic&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connection close reasons&lt;/strong&gt;: Insights into why sessions terminated (client closed, origin closed, timeouts, errors)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;how-to-access&quot;&gt;How to access&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#how-to-access&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Log in to &lt;a href=&quot;https://dash.cloudflare.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare One&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Zero Trust&lt;/strong&gt; &amp;gt; &lt;strong&gt;Insights&lt;/strong&gt; &amp;gt; &lt;strong&gt;Dashboards&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Network session analytics&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/analytics/network-sessions/&quot;&gt;Network session analytics documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category><category>Gateway</category></item><item><title>Logs, Pipelines - Cloudflare Pipelines as a Logpush destination</title><link>https://developers.cloudflare.com/changelog/post/2026-04-20-pipelines-logpush-destination/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-20-pipelines-logpush-destination/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;With this release, you can now send your logs directly to &lt;a href=&quot;https://developers.cloudflare.com/pipelines/&quot;&gt;Pipelines&lt;/a&gt; to ingest, transform, and store your logs in &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt; as Parquet files or Apache Iceberg tables managed by &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;. This makes the data footprint more compact and more efficient at querying your logs instantly with &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; or any other query engine that supports Apache Iceberg or Parquet.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;transform-logs-before-storage&quot;&gt;Transform logs before storage&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#transform-logs-before-storage&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;INSERT INTO&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; http_logs_sink&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ClientIP,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  EdgeResponseStatus,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  to_timestamp_micros(EdgeStartTimestamp) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; event_time,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  upper&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(ClientRequestMethod) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; method,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  sha256(ClientIP) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; hashed_ip&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; http_logs_stream&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; EdgeResponseStatus &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 400&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Pipelines SQL supports string functions, regex, hashing, JSON extraction, timestamp conversion, conditional expressions, and more. For the full list, refer to the &lt;a href=&quot;https://developers.cloudflare.com/pipelines/sql-reference/&quot;&gt;Pipelines SQL reference&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To configure Pipelines as a Logpush destination, refer to &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/enable-destinations/pipelines/&quot;&gt;Enable Cloudflare Pipelines&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category><category>Pipelines</category></item><item><title>R2 SQL - R2 SQL adds JSON functions, EXPLAIN FORMAT JSON, and unpartitioned table support</title><link>https://developers.cloudflare.com/changelog/post/2026-04-20-r2-sql-json-functions-explain-format/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-20-r2-sql-json-functions-explain-format/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; is Cloudflare&apos;s serverless, distributed, analytics query engine for querying &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables stored in &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;R2 SQL now supports functions for querying JSON data stored in Apache Iceberg tables, an easier way to parse query plans with &lt;code&gt;EXPLAIN FORMAT JSON&lt;/code&gt;, and querying tables without partition keys stored in &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;JSON functions extract and manipulate JSON values directly in SQL without client-side processing:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  json_get_str(doc, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;name&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; name&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  json_get_int(doc, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;user&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;profile&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;level&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; level&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  json_get_bool(doc, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;active&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; is_active&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; json_contains(doc, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;email&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For a full list of available functions, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/scalar-functions/#json-functions&quot;&gt;JSON functions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;EXPLAIN FORMAT JSON&lt;/code&gt; returns query execution plans as structured JSON for programmatic analysis and observability integrations:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sql&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; query&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;WAREHOUSE&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;EXPLAIN FORMAT JSON SELECT * FROM logpush.requests LIMIT 10;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;┌──────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; plan&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                 │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   &quot;name&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;CoalescePartitionsExec&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   &quot;output_partitions&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 1,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;            │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   &quot;rows&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 10,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                        │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   &quot;size_approx&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;310B&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;             │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   &quot;children&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [                      &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;     {&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;name&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;DataSourceExec&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;output_partitions&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 4,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;rows&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 28951,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;size_approx&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;900.0KB&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;table&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;logpush.requests&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;files&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 7,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;bytes&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 900019,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;projection&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [                &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;__ingest_ts&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;CPUTimeMs&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;DispatchNamespace&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;Entrypoint&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;Event&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                     │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;EventTimestampMs&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;          │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;EventType&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;Exceptions&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;Logs&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                      │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;Outcome&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;ScriptName&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;ScriptTags&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;ScriptVersion&quot;,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;             │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         &quot;WallTimeMs&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       ],&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                             │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       &quot;limit&quot;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;     }&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   ]&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                  │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;└──────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more details, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/#explain&quot;&gt;EXPLAIN&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/&quot;&gt;Limitations and best practices&lt;/a&gt; for the latest guidance on using R2 SQL.&lt;/p&gt;</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Security Overview - Archive and audit security action items</title><link>https://developers.cloudflare.com/changelog/post/2026-04-27-archive-and-audit-security-action-items/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-27-archive-and-audit-security-action-items/</guid><description>&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;archive-and-audit-security-action-items&quot;&gt;Archive and audit security action items&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#archive-and-audit-security-action-items&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;why-this-matters&quot;&gt;Why this matters&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#why-this-matters&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;With these new archiving options—&lt;strong&gt;False Positive&lt;/strong&gt;, &lt;strong&gt;Accept Risk&lt;/strong&gt;, and &lt;strong&gt;Other&lt;/strong&gt;—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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-features&quot;&gt;Key features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Structured Archiving:&lt;/strong&gt; Choose from specific categories to define why an action item is being moved.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Required Rationale:&lt;/strong&gt; For &quot;Accept Risk&quot; and &quot;Other&quot; categories, users must provide documentation, ensuring accountability for security decisions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit Log Transparency:&lt;/strong&gt; New API endpoints allow you to programmatically retrieve the history of status changes and rationale for any insight at the account or zone level.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reversible Actions:&lt;/strong&gt; Any archived item can be moved back to the active list at any time if the security context changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;:::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.
:::&lt;/p&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-retrieve-audit-logs-via-api&quot;&gt;Example: Retrieve audit logs via API&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-retrieve-audit-logs-via-api&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To review the history and rationale of a specific archived issue at the account level, you can use the following API command:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;[https://api.cloudflare.com/client/v4/accounts/](https://api.cloudflare.com/client/v4/accounts/){account_id}/insights/{insight_id}/audit-log&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &amp;lt;API_TOKEN&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate><product>Security Overview</product><category>Security Overview</category></item><item><title>Workers AI - Moonshot AI Kimi K2.6 now available on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2026-04-20-kimi-k2-6-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-20-kimi-k2-6-workers-ai/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.6/&quot;&gt;&lt;code&gt;@cf/moonshotai/kimi-k2.6&lt;/code&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-capabilities&quot;&gt;Key capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;262.1k token context window&lt;/strong&gt; for retaining full conversation history, tool definitions, and codebases across long-running agent sessions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Long-horizon coding&lt;/strong&gt; with significant improvements on complex, end-to-end coding tasks across languages including Rust, Go, and Python&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coding-driven design&lt;/strong&gt; that transforms simple prompts and visual inputs into production-ready interfaces and full-stack workflows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent swarm orchestration&lt;/strong&gt; scaling horizontally to 300 sub-agents executing 4,000 coordinated steps for complex autonomous tasks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vision inputs&lt;/strong&gt; for processing images alongside text&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thinking mode&lt;/strong&gt; with configurable reasoning depth&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-turn tool calling&lt;/strong&gt; for building agents that invoke tools across multiple conversation turns&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;differences-from-kimi-k25&quot;&gt;Differences from Kimi K2.5&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#differences-from-kimi-k25&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If you are migrating from Kimi K2.5, note the following API changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;K2.6 uses &lt;code&gt;chat_template_kwargs.thinking&lt;/code&gt; to control reasoning, replacing &lt;code&gt;chat_template_kwargs.enable_thinking&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;K2.6 returns reasoning content in the &lt;code&gt;reasoning&lt;/code&gt; field, replacing &lt;code&gt;reasoning_content&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Use Kimi K2.6 through the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/bindings/&quot;&gt;Workers AI binding&lt;/a&gt; (&lt;code&gt;env.AI.run()&lt;/code&gt;), the REST API at &lt;code&gt;/ai/run&lt;/code&gt;, or the OpenAI-compatible endpoint at &lt;code&gt;/v1/chat/completions&lt;/code&gt;. You can also use &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt; with any of these endpoints.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.6/&quot;&gt;Kimi K2.6 model page&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 20 Apr 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Access - Homepage and sign-out for MCP server portals</title><link>https://developers.cloudflare.com/changelog/post/2026-04-17-mcp-portal-homepage-and-sign-out/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-17-mcp-portal-homepage-and-sign-out/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/&quot;&gt;MCP server portals&lt;/a&gt; display a homepage when users visit the portal domain in a browser.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1037,height=631,format=webp/_astro/portals-homepage-disconnected.BHbOwayQ.png&quot; alt=&quot;MCP server portal homepage showing connection status and setup instructions&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1037&quot; height=&quot;631&quot;&gt;
&lt;p&gt;The homepage shows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The portal name and organization branding&lt;/li&gt;
&lt;li&gt;The MCP endpoint URL with a copy button&lt;/li&gt;
&lt;li&gt;Per-client connection instructions for Claude Desktop, Workers AI Playground, OpenCode, Windsurf, and other MCP clients&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Authenticated users see their email address and a &lt;strong&gt;Sign out&lt;/strong&gt; button. Selecting &lt;strong&gt;Sign out&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#portal-homepage&quot;&gt;MCP server portals&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>AI Crawl Control - Introducing Redirects for AI Training</title><link>https://developers.cloudflare.com/changelog/post/2026-04-17-redirects-for-ai-training/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-17-redirects-for-ai-training/</guid><description>&lt;p&gt;Cloudflare&apos;s network now supports redirecting verified AI training crawlers to canonical URLs when they request deprecated or duplicate pages. When enabled via &lt;strong&gt;AI Crawl Control&lt;/strong&gt; &amp;gt; &lt;strong&gt;Quick Actions&lt;/strong&gt;, 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.&lt;/p&gt;
&lt;p&gt;This feature leverages your existing &lt;code&gt;&amp;lt;link rel=&quot;canonical&quot;&amp;gt;&lt;/code&gt; tags. No additional configuration required beyond enabling the toggle. Available on Pro, Business, and Enterprise plans at no additional cost.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/reference/redirects-for-ai-training/&quot;&gt;Redirects for AI Training documentation&lt;/a&gt; for details.&lt;/p&gt;</description><pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate><product>AI Crawl Control</product><category>AI Crawl Control</category></item><item><title>AI Crawl Control - Tools to prepare your site for the agentic Internet</title><link>https://developers.cloudflare.com/changelog/post/2026-04-17-tools-for-agentic-internet/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-17-tools-for-agentic-internet/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;content-format-insights&quot;&gt;Content Format insights&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#content-format-insights&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;strong&gt;Metrics&lt;/strong&gt; tab now includes a &lt;strong&gt;Content Format&lt;/strong&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;directives-tab-formerly-robotstxt&quot;&gt;Directives tab (formerly Robots.txt)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#directives-tab-formerly-robotstxt&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;strong&gt;Robots.txt&lt;/strong&gt; tab has been renamed to &lt;strong&gt;Directives&lt;/strong&gt; and now includes a link to check your site&apos;s &lt;a href=&quot;https://isitagentready.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agent Readiness&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; score.&lt;/p&gt;
&lt;p&gt;Refer to our &lt;a href=&quot;https://blog.cloudflare.com/agent-readiness/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;blog post on preparing for the agentic Internet&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; for more on why these capabilities matter.&lt;/p&gt;</description><pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate><product>AI Crawl Control</product><category>AI Crawl Control</category></item><item><title>Cache - Smart Tiered Cache optimizes public cloud origins</title><link>https://developers.cloudflare.com/changelog/post/2026-04-17-smart-tiered-cache-for-public-cloud/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-17-smart-tiered-cache-for-public-cloud/</guid><description>&lt;p&gt;You can now achieve higher cache HIT rates and reduce origin load for origins hosted on public cloud providers with &lt;a href=&quot;https://developers.cloudflare.com/cache/how-to/tiered-cache/#smart-tiered-cache&quot;&gt;Smart Tiered Cache&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;how-it-works&quot;&gt;How it works&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#how-it-works&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Set a cloud region hint (for example, &lt;code&gt;aws/us-east-1&lt;/code&gt; or &lt;code&gt;gcp/europe-west1&lt;/code&gt;) 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.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Supported providers&lt;/strong&gt;: AWS, GCP, Azure, and Oracle Cloud.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;All plans&lt;/strong&gt;: Available on Free, Pro, Business, and Enterprise plans at no additional cost.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dashboard and API&lt;/strong&gt;: Configure from &lt;strong&gt;Caching&lt;/strong&gt; &amp;gt; &lt;strong&gt;Tiered Cache&lt;/strong&gt; &amp;gt; &lt;strong&gt;Origin Configuration&lt;/strong&gt;, or use the API and Terraform.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To get started, enable &lt;a href=&quot;https://developers.cloudflare.com/cache/how-to/tiered-cache/&quot;&gt;Smart Tiered Cache&lt;/a&gt; and set a cloud region hint for your origin in the &lt;a href=&quot;https://developers.cloudflare.com/cache/how-to/tiered-cache/#public-cloud-origins&quot;&gt;Tiered Cache settings&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate><product>Cache</product><category>Cache</category></item><item><title>Radar - AI Insights updates on Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-04-17-radar-ai-insights-updates/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-17-radar-ai-insights-updates/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; adds three new features to the &lt;a href=&quot;https://radar.cloudflare.com/ai-insights&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI Insights&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; page, expanding visibility into how AI bots, crawlers, and agents interact with the web.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;adoption-of-ai-agent-standards&quot;&gt;Adoption of AI agent standards&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#adoption-of-ai-agent-standards&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The AI Insights page now includes an &lt;a href=&quot;https://radar.cloudflare.com/ai-insights#adoption-of-ai-agent-standards&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;adoption of AI agent standards&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/agent_readiness/methods/summary/&quot;&gt;Agent Readiness API reference&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1332,format=webp/_astro/agent-readiness-adoption-chart.B3ATN59P.png&quot; alt=&quot;Screenshot of the adoption of AI agent standards chart&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;1332&quot;&gt;
&lt;p&gt;&lt;a href=&quot;https://radar.cloudflare.com/scan&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;URL Scanner&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; reports now include an &lt;strong&gt;Agent readiness&lt;/strong&gt; tab that evaluates a scanned URL against the criteria used by the &lt;a href=&quot;https://isitagentready.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agent Readiness score tool&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1999,height=1145,format=webp/_astro/agent-readiness-url-scanner.DRVuuaUi.png&quot; alt=&quot;Screenshot of the URL Scanner agent readiness tab&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1999&quot; height=&quot;1145&quot;&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://blog.cloudflare.com/agent-readiness/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agent Readiness blog post&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;markdown-for-agents-savings&quot;&gt;Markdown for Agents savings&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#markdown-for-agents-savings&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A new &lt;a href=&quot;https://radar.cloudflare.com/ai-insights#markdown-for-agents-savings&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;savings gauge&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/&quot;&gt;Markdown for Agents&lt;/a&gt; provides.&lt;/p&gt;
&lt;div style=&quot;max-width: 300px;&quot;&gt;&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=614,height=652,format=webp/_astro/markdown-for-agents-savings.Di1GjNON.png&quot; alt=&quot;Screenshot of the Markdown for Agents savings gauge&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;614&quot; height=&quot;652&quot;&gt;&lt;/div&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/ai/subresources/markdown_for_agents/methods/summary&quot;&gt;Markdown for Agents API reference&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;response-status&quot;&gt;Response status&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#response-status&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The new &lt;a href=&quot;https://radar.cloudflare.com/ai-insights#response-status&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;response status widget&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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).&lt;/p&gt;
&lt;p&gt;The same widget is available on each verified bot&apos;s detail page (only available for AI bots), for example &lt;a href=&quot;https://radar.cloudflare.com/bots/directory/google#response-status&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Google&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=878,format=webp/_astro/ai-response-status.BwSMF23Z.png&quot; alt=&quot;Screenshot of the response status distribution widget&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;878&quot;&gt;
&lt;p&gt;Explore all three features on the &lt;a href=&quot;https://radar.cloudflare.com/ai-insights&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Radar AI Insights&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; page.&lt;/p&gt;</description><pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>AI Search - AI Search instances now include built-in storage and namespace Workers Bindings</title><link>https://developers.cloudflare.com/changelog/post/2026-04-16-ai-search-namespace-binding/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-16-ai-search-namespace-binding/</guid><description>&lt;p&gt;New &lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;built-in-storage-and-vector-index&quot;&gt;Built-in storage and vector index&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#built-in-storage-and-vector-index&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;All new instances now comes with built-in storage which allows you to upload files directly to it using the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/api/items/workers-binding/&quot;&gt;Items API&lt;/a&gt; or the dashboard. No R2 buckets to set up, no external data sources to connect first.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; instance&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI_SEARCH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-instance&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// upload and wait for indexing to complete&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; item&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.items.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;uploadAndPoll&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;faq.md&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, content);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// search immediately after indexing&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; results&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	messages: [{ role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, content: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;onboarding guide&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;namespace-binding&quot;&gt;Namespace binding&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#namespace-binding&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The new &lt;code&gt;ai_search_namespaces&lt;/code&gt; binding replaces the previous &lt;code&gt;env.AI.autorag()&lt;/code&gt; API provided through the &lt;code&gt;AI&lt;/code&gt; binding. It gives your Worker access to all instances within a &lt;a href=&quot;https://developers.cloudflare.com/ai-search/concepts/namespaces/&quot;&gt;namespace&lt;/a&gt; and lets you create, update, and delete instances at runtime without redeploying.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// wrangler.jsonc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;ai_search_namespaces&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;AI_SEARCH&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;namespace&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;default&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// create an instance at runtime&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; instance&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI_SEARCH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	id: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-instance&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For migration details, refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-search/api/migration/workers-binding/&quot;&gt;Workers binding migration&lt;/a&gt;. For more on namespaces, refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-search/concepts/namespaces/&quot;&gt;Namespaces&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cross-instance-search&quot;&gt;Cross-instance search&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cross-instance-search&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; results&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI_SEARCH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	messages: [{ role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, content: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;What is Cloudflare?&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	ai_search_options: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		instance_ids: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;product-docs&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;customer-abc123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-search/api/search/workers-binding/#namespace-level&quot;&gt;Namespace-level search&lt;/a&gt; for details.&lt;/p&gt;</description><pubDate>Thu, 16 Apr 2026 12:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>AI Search - AI Search now has hybrid search and relevance boosting</title><link>https://developers.cloudflare.com/changelog/post/2026-04-16-hybrid-search-and-relevance-boosting/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-16-hybrid-search-and-relevance-boosting/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now supports hybrid search and relevance boosting, giving you more control over how results are found and ranked.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;hybrid-search&quot;&gt;Hybrid search&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#hybrid-search&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;You can configure the tokenizer (&lt;code&gt;porter&lt;/code&gt; for natural language, &lt;code&gt;trigram&lt;/code&gt; for code), keyword match mode (&lt;code&gt;and&lt;/code&gt; for precision, &lt;code&gt;or&lt;/code&gt; for recall), and fusion method (&lt;code&gt;rrf&lt;/code&gt; or &lt;code&gt;max&lt;/code&gt;) per instance:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; instance&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI_SEARCH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	id: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-instance&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	index_method: { vector: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, keyword: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	fusion_method: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;rrf&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	indexing_options: { keyword_tokenizer: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;porter&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	retrieval_options: { keyword_match_mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;and&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-search/concepts/search-modes/&quot;&gt;Search modes&lt;/a&gt; for an overview and &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/indexing/hybrid-search/&quot;&gt;Hybrid search&lt;/a&gt; for configuration details.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;relevance-boosting&quot;&gt;Relevance boosting&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#relevance-boosting&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Relevance boosting lets you nudge search rankings based on document metadata. For example, you can prioritize recent documents by boosting on &lt;code&gt;timestamp&lt;/code&gt;, or surface high-priority content by boosting on a custom metadata field like &lt;code&gt;priority&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Configure up to 3 boost fields per instance or override them per request:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; results&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI_SEARCH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-instance&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;search&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	messages: [{ role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, content: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;deployment guide&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	ai_search_options: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		retrieval: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			boost_by: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				{ field: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;timestamp&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, direction: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;desc&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				{ field: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;priority&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, direction: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;desc&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/retrieval/boosting/&quot;&gt;Relevance boosting&lt;/a&gt; for configuration details.&lt;/p&gt;</description><pubDate>Thu, 16 Apr 2026 12:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Artifacts - Artifacts now in beta: versioned filesystem with Git access</title><link>https://developers.cloudflare.com/changelog/post/2026-04-16-artifacts-now-in-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-16-artifacts-now-in-beta/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/artifacts/&quot;&gt;Artifacts&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;You can &lt;a href=&quot;https://blog.cloudflare.com/artifacts-git-for-agents-beta/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;read the announcement blog&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to learn more about what Artifacts does, how it works, and how to create repositories for your agents to use.&lt;/p&gt;
&lt;p&gt;Artifacts has three API surfaces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Workers bindings (for creating and managing repositories)&lt;/li&gt;
&lt;li&gt;REST API (for creating and managing repos from any other compute platform)&lt;/li&gt;
&lt;li&gt;Git protocol (for interacting with repos)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As an example: you can use the Workers binding to create a repo and read back its remote URL:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;# Create a thousand, a million or ten million &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;repos&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: one for every agent, for every upstream branch, or every user.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; created&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;PROD_ARTIFACTS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;agent-007&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; remote&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; created.repo.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;())?.remote;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Or, use the REST API to create a repo inside a namespace from your agent(s) running on any platform:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://artifacts.cloudflare.net/v1/api/namespaces/some-namespace/repos&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&quot;name&quot;:&quot;agent-007&quot;}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Any Git client that speaks smart HTTP can use the returned remote URL:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Agents know git.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Every repository can act as a git repo, allowing agents to interact with Artifacts the way they know best: using the git CLI.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; clone&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://x:&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;${REPO_TOKEN}&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;@artifacts.cloudflare.net/some-namespace/agent-007.git&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To learn more, refer to &lt;a href=&quot;https://developers.cloudflare.com/artifacts/get-started/&quot;&gt;Get started&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/artifacts/api/workers-binding/&quot;&gt;Workers binding&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/artifacts/api/git-protocol/&quot;&gt;Git protocol&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate><product>Artifacts</product><category>Artifacts</category></item><item><title>Email Service - Email Sending now in public beta</title><link>https://developers.cloudflare.com/changelog/post/2026-04-16-email-sending-public-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-16-email-sending-public-beta/</guid><description>
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/email-service/api/send-emails/&quot;&gt;Email Sending&lt;/a&gt;&lt;/strong&gt; is now in public beta. Send transactional emails directly from Workers (&lt;code&gt;env.EMAIL.send()&lt;/code&gt;) or the REST API, with support for HTML, plain text, attachments, inline images, and custom headers. Email Sending joins &lt;a href=&quot;https://blog.cloudflare.com/introducing-email-routing/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Email Routing&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; under the new &lt;strong&gt;Cloudflare Email Service&lt;/strong&gt; — a single service for sending and receiving email on the Cloudflare developer platform.&lt;/p&gt;
&lt;p&gt;Send an email from a Worker in a few lines of code:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;EMAIL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			from: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;notifications@yourdomain.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			to: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user@example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			subject: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Order confirmed&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			html: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;h1&gt;Your order has been confirmed&amp;#x3C;/h1&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			text: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Your order has been confirmed.&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ messageId: response.messageId });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;src/index.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;EMAIL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			from: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;notifications@yourdomain.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			to: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user@example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			subject: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Order confirmed&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			html: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;h1&gt;Your order has been confirmed&amp;#x3C;/h1&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			text: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Your order has been confirmed.&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ messageId: response.messageId });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExportedHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;Email Service also integrates with the &lt;a href=&quot;https://developers.cloudflare.com/agents/&quot;&gt;Agents SDK&lt;/a&gt;, giving your agents a native &lt;code&gt;onEmail&lt;/code&gt; hook to receive, process, and reply to emails. Combined with the new &lt;a href=&quot;https://github.com/cloudflare/mcp-server-cloudflare&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Email MCP server&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and Wrangler CLI email commands, any agent can send email regardless of where it runs.&lt;/p&gt;
&lt;p&gt;Start sending and receiving emails from Workers and agents today. Email Sending is available on the Workers paid plan. Refer to the &lt;a href=&quot;https://developers.cloudflare.com/email-service/&quot;&gt;Email Service documentation&lt;/a&gt; to get started.&lt;/p&gt;</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate><product>Email Service</product><category>Email Service</category></item><item><title>Workflows, Workers - Increased concurrency, creation rate, and queued instance limits for Workflows instances</title><link>https://developers.cloudflare.com/changelog/post/2026-04-15-workflows-limits-raised/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-15-workflows-limits-raised/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt; limits have been raised to the following:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;th&gt;Previous&lt;/th&gt;
&lt;th&gt;New&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Concurrent instances (running in parallel)&lt;/td&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instance creation rate (per account)&lt;/td&gt;
&lt;td&gt;100/second per account&lt;/td&gt;
&lt;td&gt;300/second per account, 100/second per workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Queued instances per Workflow &lt;sup&gt;&lt;a href=&quot;#user-content-fn-1&quot; id=&quot;user-content-fnref-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;td&gt;1 million&lt;/td&gt;
&lt;td&gt;2 million&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;These increases apply to all users on the &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/pricing/&quot;&gt;Workers Paid plan&lt;/a&gt;. Refer to the &lt;a href=&quot;https://developers.cloudflare.com/workflows/reference/limits/&quot;&gt;Workflows limits documentation&lt;/a&gt; for more details.&lt;/p&gt;
&lt;section data-footnotes class=&quot;footnotes&quot;&gt;&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 class=&quot;sr-only&quot; id=&quot;footnote-label&quot;&gt;Footnotes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#footnote-label&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li id=&quot;user-content-fn-1&quot;&gt;
&lt;p&gt;Queued instances are instances that have been created or awoken and are waiting for a concurrency slot. &lt;a href=&quot;#user-content-fnref-1&quot; data-footnote-backref=&quot;&quot; aria-label=&quot;Back to reference 1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;</description><pubDate>Wed, 15 Apr 2026 13:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Browser Run - Browser Rendering is now Browser Run</title><link>https://developers.cloudflare.com/changelog/post/2026-04-15-br-rename/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-15-br-rename/</guid><description>&lt;p&gt;We are renaming Browser Rendering to &lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/&quot;&gt;Browser Run&lt;/a&gt;&lt;/strong&gt;. The name Browser Rendering never fully captured what the product does. Browser Run lets you run full browser sessions on Cloudflare&apos;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.&lt;/p&gt;
&lt;p&gt;Along with the rename, we have increased limits for Workers Paid plans and redesigned the Browser Run dashboard.&lt;/p&gt;
&lt;p&gt;We have 4x-ed concurrency limits for Workers Paid plan users:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Concurrent browsers per account&lt;/strong&gt;: 30 → &lt;strong&gt;120 per account&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New browser instances&lt;/strong&gt;: 30 per minute → &lt;strong&gt;1 per second&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;REST API rate limits&lt;/strong&gt;: recently increased from &lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-03-04-br-rest-api-limit-increase/&quot;&gt;3 to 10 requests per second&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rate limits across the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/limits/&quot;&gt;limits page&lt;/a&gt; are now expressed in per-second terms, matching how they are enforced. No action is needed to benefit from the higher limits.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/browser-run&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;redesigned dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/images/browser-run/BRdashboardredesign.png&quot; alt=&quot;Browser Run dashboard Runs tab with browser sessions and quick actions visible in one list, and an expanded crawl job showing its progress&quot;&gt;
&lt;p&gt;We are also shipping several new features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-04-15-br-observability/&quot;&gt;Live View, Human in the Loop, and Session Recordings&lt;/a&gt;&lt;/strong&gt; - 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-04-15-br-webmcp/&quot;&gt;WebMCP&lt;/a&gt;&lt;/strong&gt; - Websites can expose structured tools for AI agents to discover and call directly, replacing slow screenshot-analyze-click loops.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the full story, read our Agents Week blog &lt;a href=&quot;https://blog.cloudflare.com/browser-run-for-ai-agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Browser Run: Give your agents a browser&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 15 Apr 2026 12:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>Browser Run - Browser Run adds Live View, Human in the Loop, and Session Recordings</title><link>https://developers.cloudflare.com/changelog/post/2026-04-15-br-observability/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-15-br-observability/</guid><description>&lt;p&gt;When browser automation fails or behaves unexpectedly, it can be hard to understand what happened. We are shipping three new features in &lt;a href=&quot;https://developers.cloudflare.com/browser-run/&quot;&gt;Browser Run&lt;/a&gt; (formerly Browser Rendering) to help:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/features/live-view/&quot;&gt;Live View&lt;/a&gt;&lt;/strong&gt; for real-time visibility&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/features/human-in-the-loop/&quot;&gt;Human in the Loop&lt;/a&gt;&lt;/strong&gt; for human intervention&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/features/session-recording/&quot;&gt;Session Recordings&lt;/a&gt;&lt;/strong&gt; for replaying sessions after they end&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;live-view&quot;&gt;Live View&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#live-view&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/features/live-view/&quot;&gt;Live View&lt;/a&gt; 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 &lt;code&gt;live.browser.run&lt;/code&gt;, or using native Chrome DevTools.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;human-in-the-loop&quot;&gt;Human in the Loop&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#human-in-the-loop&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/browser-run/features/human-in-the-loop/&quot;&gt;Human in the Loop&lt;/a&gt;, a human steps into the live browser session through Live View, resolves the issue, and hands control back to the script.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/images/browser-run/liveview.gif&quot; alt=&quot;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&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;session-recordings&quot;&gt;Session Recordings&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#session-recordings&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/features/session-recording/&quot;&gt;Session Recordings&lt;/a&gt; records DOM state so you can replay any session after it ends. Enable recordings by passing &lt;code&gt;recording: true&lt;/code&gt; when launching a browser. After the session closes, view the recording in the Cloudflare dashboard under &lt;strong&gt;Browser Run&lt;/strong&gt; &amp;gt; &lt;strong&gt;Runs&lt;/strong&gt;, 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/images/browser-run/sessionrecording.gif&quot; alt=&quot;Browser Run session recording showing an automated browser navigating the Sentry Shop and adding a bomber jacket to the cart&quot;&gt;
&lt;p&gt;To get started, refer to the documentation for &lt;a href=&quot;https://developers.cloudflare.com/browser-run/features/live-view/&quot;&gt;Live View&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/browser-run/features/human-in-the-loop/&quot;&gt;Human in the Loop&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/browser-run/features/session-recording/&quot;&gt;Session Recording&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 15 Apr 2026 11:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>Browser Run - Browser Run adds WebMCP support</title><link>https://developers.cloudflare.com/changelog/post/2026-04-15-br-webmcp/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-15-br-webmcp/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/&quot;&gt;Browser Run&lt;/a&gt; (formerly Browser Rendering) now supports &lt;a href=&quot;https://webmachinelearning.github.io/webmcp/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WebMCP&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; (Web Model Context Protocol), a new browser API from the Google Chrome team.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;searchFlights()&lt;/code&gt; or &lt;code&gt;bookTicket()&lt;/code&gt; with typed parameters, making browser automation faster, more reliable, and less fragile.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/images/browser-run/webMCP.gif&quot; alt=&quot;Browser Run lab session showing WebMCP tools being discovered and executed in the Chrome DevTools console to book a hotel&quot;&gt;
&lt;p&gt;With WebMCP, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Discover website tools&lt;/strong&gt; - Use &lt;code&gt;navigator.modelContextTesting.listTools()&lt;/code&gt; to see available actions on any WebMCP-enabled site&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Execute tools directly&lt;/strong&gt; - Call &lt;code&gt;navigator.modelContextTesting.executeTool()&lt;/code&gt; with typed parameters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handle human-in-the-loop interactions&lt;/strong&gt; - Some tools pause for user confirmation before completing sensitive actions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;code&gt;lab=true&lt;/code&gt; to your &lt;code&gt;/devtools/browser&lt;/code&gt; request:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/devtools/browser?lab=true&amp;amp;keep_alive=300000&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer {api_token}&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Combined with the recently launched &lt;a href=&quot;https://developers.cloudflare.com/browser-run/cdp/&quot;&gt;CDP endpoint&lt;/a&gt;, AI agents can also use WebMCP. Connect an &lt;a href=&quot;https://developers.cloudflare.com/browser-run/cdp/mcp-clients/&quot;&gt;MCP client&lt;/a&gt; to Browser Run via CDP, and your agent can discover and call website tools directly. Here&apos;s the same hotel booking demo, this time driven by an AI agent through OpenCode:&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/images/browser-run/webMCPagent.gif&quot; alt=&quot;Browser Run Live View showing an AI agent navigating a hotel booking site in real time&quot;&gt;
&lt;p&gt;For a step-by-step guide, refer to the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/features/webmcp/&quot;&gt;WebMCP documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 15 Apr 2026 10:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>Access - Independent MFA for Access applications</title><link>https://developers.cloudflare.com/changelog/post/2026-04-15-independent-mfa/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-15-independent-mfa/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Independent MFA supports the following authenticator types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Authenticator application&lt;/strong&gt; — Time-based one-time passwords (TOTP) using apps like Google Authenticator, Microsoft Authenticator, or Authy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security key&lt;/strong&gt; — Hardware security keys such as YubiKeys.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Biometrics&lt;/strong&gt; — Built-in device authenticators including Apple Touch ID, Apple Face ID, and Windows Hello.&lt;/li&gt;
&lt;/ul&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;Infrastructure applications do not yet support independent MFA.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;configuration-levels&quot;&gt;Configuration levels&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#configuration-levels&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can configure MFA requirements at three levels:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Organization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enforce MFA by default for all applications in your account.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Application&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Require or turn off MFA for a specific application.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Require or turn off MFA for users who match a specific policy.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Settings at lower levels (policy) override settings at higher levels (organization), giving you granular control over MFA enforcement.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;user-enrollment&quot;&gt;User enrollment&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#user-enrollment&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Users enroll their authenticators through the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/app-launcher/&quot;&gt;App Launcher&lt;/a&gt;. To help with onboarding, administrators can share a direct enrollment link: &lt;code&gt;&amp;lt;your-team-name&amp;gt;.cloudflareaccess.com/AddMfaDevice&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To get started with Independent MFA, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/independent-mfa/&quot;&gt;Independent MFA&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Agents - Agent Lee adds Write Operations and Generative UI</title><link>https://developers.cloudflare.com/changelog/post/2026-04-15-agentlee-writeops-genui/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-15-agentlee-writeops-genui/</guid><description>&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;agent-lee-adds-write-operations-and-generative-ui&quot;&gt;Agent Lee adds Write Operations and Generative UI&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#agent-lee-adds-write-operations-and-generative-ui&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;We are excited to announce two major capability upgrades for &lt;strong&gt;Agent Lee&lt;/strong&gt;, 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;take-action-with-write-operations&quot;&gt;Take action with Write Operations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#take-action-with-write-operations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To ensure security and accuracy, every write operation requires &lt;strong&gt;explicit user approval&lt;/strong&gt;. 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 &lt;strong&gt;Confirm&lt;/strong&gt;, and this approval requirement is enforced at the infrastructure level to prevent unauthorized changes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example requests:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&quot;Add an A record for blog.example.com pointing to 192.0.2.10.&quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&quot;Enable Always Use HTTPS on my zone.&quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&quot;Set the SSL mode for example.com to Full (strict).&quot;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;visualize-data-with-generative-ui&quot;&gt;Visualize data with Generative UI&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#visualize-data-with-generative-ui&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Understanding your traffic and security trends is now as easy as asking a question. Agent Lee now features &lt;strong&gt;Generative UI&lt;/strong&gt;, allowing it to render inline charts and structured data visualizations directly within the chat interface using your actual account telemetry.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example requests:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&quot;Show me a chart of my traffic over the last 7 days.&quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&quot;What does my error rate look like for the past 24 hours?&quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&quot;Graph my cache hit rate for example.com this week.&quot;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;availability&quot;&gt;Availability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#availability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;These features are currently available in &lt;strong&gt;Beta&lt;/strong&gt; for all users on the &lt;strong&gt;Free plan&lt;/strong&gt;. To get started, log in to the &lt;a href=&quot;https://dash.cloudflare.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and select &lt;strong&gt;Ask AI&lt;/strong&gt; in the upper right corner.&lt;/p&gt;
&lt;p&gt;To learn more about how to interact with your account using AI, refer to the &lt;a href=&quot;https://developers.cloudflare.com/agent-lee/&quot;&gt;Agent Lee documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category></item><item><title>Cloudflare One - New, streamlined creation experience for Access Applications and Gateway Policies</title><link>https://developers.cloudflare.com/changelog/post/2026-04-15-new-rule-and-application-builders/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-15-new-rule-and-application-builders/</guid><description>&lt;p&gt;The Cloudflare One dashboard now features redesigned builders for two core workflows: creating Gateway policies and configuring self-hosted Access applications.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;gateway-rule-builder&quot;&gt;Gateway rule builder&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#gateway-rule-builder&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The Gateway rule builder now features a redesigned user experience, bringing it in line with the Access policy builder experience. Improvements include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Streamlined UX&lt;/strong&gt; with clearer states and improved user interactions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wirefilter editing&lt;/strong&gt; for viewing and editing Gateway rules directly from wirefilter expressions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preview state&lt;/strong&gt; to review the impact of your policy in a simple graphic&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1280,height=1494,format=webp/_astro/gateway-rule-builder.BxvzsN8s.png&quot; alt=&quot;New Gateway rule builder&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1280&quot; height=&quot;1494&quot;&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot;&gt;Traffic policies&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;access-application-builder-for-self-hosted-apps&quot;&gt;Access application builder for self-hosted apps&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#access-application-builder-for-self-hosted-apps&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The self-hosted Access application builder now offers a simplified creation workflow with fewer steps from setup to save. Improvements include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New application selection experience&lt;/strong&gt; that makes choosing the right application type before you begin easier.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streamlined creation flow&lt;/strong&gt; with fewer clicks to build and save an application&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inline policy creation&lt;/strong&gt; for building Access policies directly within the application creation flow&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preview state&lt;/strong&gt; to understand how your policies enforce user access before saving&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1970,height=1104,format=webp/_astro/access-application-builder.B__yqGin.png&quot; alt=&quot;New Access application builder&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1970&quot; height=&quot;1104&quot;&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/&quot;&gt;self-hosted applications&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category></item><item><title>Digital Experience Monitoring - Last seen timestamp for Cloudflare One Client devices is more consistent</title><link>https://developers.cloudflare.com/changelog/post/2026-04-15-dex-consistent-last-seen-timestamps/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-15-dex-consistent-last-seen-timestamps/</guid><description>&lt;p&gt;The last seen timestamp for &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/&quot;&gt;Cloudflare One Client&lt;/a&gt; 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&apos;s network.&lt;/p&gt;</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><product>Digital Experience Monitoring</product><category>Digital Experience Monitoring</category></item><item><title>Logs - New TenantID and Firewall for AI fields in Logpush datasets</title><link>https://developers.cloudflare.com/changelog/post/2026-04-15-logpush-new-fields/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-15-logpush-new-fields/</guid><description>&lt;p&gt;Cloudflare has added new fields to multiple &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/&quot;&gt;Logpush datasets&lt;/a&gt;:&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;tenantid-field&quot;&gt;TenantID field&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#tenantid-field&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The following Gateway and Zero Trust datasets now include a &lt;code&gt;TenantID&lt;/code&gt; field:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/gateway_dns/#tenantid&quot;&gt;Gateway DNS&lt;/a&gt;&lt;/strong&gt;: Identifies the tenant ID of the DNS request, if it exists.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/gateway_http/#tenantid&quot;&gt;Gateway HTTP&lt;/a&gt;&lt;/strong&gt;: Identifies the tenant ID of the HTTP request, if it exists.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/gateway_network/#tenantid&quot;&gt;Gateway Network&lt;/a&gt;&lt;/strong&gt;: Identifies the tenant ID of the network session, if it exists.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/zero_trust_network_sessions/#tenantid&quot;&gt;Zero Trust Network Sessions&lt;/a&gt;&lt;/strong&gt;: Identifies the tenant ID of the network session, if it exists.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;firewall-for-ai-fields&quot;&gt;Firewall for AI fields&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#firewall-for-ai-fields&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The following datasets now include &lt;a href=&quot;https://developers.cloudflare.com/api-shield/security/volumetric-abuse-detection/#firewall-for-ai&quot;&gt;Firewall for AI&lt;/a&gt; fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/zone/firewall_events/&quot;&gt;Firewall Events&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FirewallForAIInjectionScore&lt;/code&gt;: The score indicating the likelihood of a prompt injection attack in the request.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FirewallForAIPIICategories&lt;/code&gt;: List of PII categories detected in the request.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FirewallForAITokenCount&lt;/code&gt;: The number of tokens in the request.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FirewallForAIUnsafeTopicCategories&lt;/code&gt;: List of unsafe topic categories detected in the request.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/zone/http_requests/&quot;&gt;HTTP Requests&lt;/a&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FirewallForAIInjectionScore&lt;/code&gt;: The score indicating the likelihood of a prompt injection attack in the request.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FirewallForAIPIICategories&lt;/code&gt;: List of PII categories detected in the request.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FirewallForAITokenCount&lt;/code&gt;: The number of tokens in the request.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;FirewallForAIUnsafeTopicCategories&lt;/code&gt;: List of unsafe topic categories detected in the request.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the complete field definitions for each dataset, refer to &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/&quot;&gt;Logpush datasets&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>Privacy Proxy - Privacy Proxy metrics now available via GraphQL Analytics API</title><link>https://developers.cloudflare.com/changelog/post/2026-04-15-graphql-analytics-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-15-graphql-analytics-api/</guid><description>&lt;p&gt;Privacy Proxy metrics are now queryable through Cloudflare&apos;s &lt;a href=&quot;https://developers.cloudflare.com/privacy-proxy/reference/metrics/graphql/&quot;&gt;GraphQL Analytics API&lt;/a&gt;, the new default method for accessing Privacy Proxy observability data. All metrics are available through a single endpoint:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/graphql&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &amp;lt;API_TOKEN&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;query&quot;: &quot;{ viewer { accounts(filter: { accountTag: $accountTag }) { privacyProxyRequestMetricsAdaptiveGroups(filter: { date_geq: $startDate, date_leq: $endDate }, limit: 10000, orderBy: [date_ASC]) { count dimensions { date } } } } }&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;variables&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;accountTag&quot;: &quot;&amp;lt;YOUR_ACCOUNT_TAG&amp;gt;&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;startDate&quot;: &quot;2026-04-04&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;endDate&quot;: &quot;2026-04-06&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;available-nodes&quot;&gt;Available nodes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#available-nodes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Four GraphQL nodes are now live, providing aggregate metrics across all key dimensions of your Privacy Proxy deployment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;privacyProxyRequestMetricsAdaptiveGroups&lt;/code&gt;&lt;/strong&gt; — Request volume, error rates, status codes, and proxy status breakdowns.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;privacyProxyIngressConnMetricsAdaptiveGroups&lt;/code&gt;&lt;/strong&gt; — Client-to-proxy connection counts, bytes transferred, and latency percentiles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;privacyProxyEgressConnMetricsAdaptiveGroups&lt;/code&gt;&lt;/strong&gt; — Proxy-to-origin connection counts, bytes transferred, and latency percentiles.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;privacyProxyAuthMetricsAdaptiveGroups&lt;/code&gt;&lt;/strong&gt; — Authentication attempt counts by method and result.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All nodes support filtering by time, data center (&lt;code&gt;coloCode&lt;/code&gt;), and endpoint, with additional node-specific dimensions such as transport protocol and authentication method.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-this-means-for-existing-opentelemetry-users&quot;&gt;What this means for existing OpenTelemetry users&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-this-means-for-existing-opentelemetry-users&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;learn-more&quot;&gt;Learn more&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#learn-more&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/privacy-proxy/reference/metrics/graphql/&quot;&gt;GraphQL Analytics API for Privacy Proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/graphql-api/getting-started/&quot;&gt;GraphQL Analytics API — getting started&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><product>Privacy Proxy</product><category>Privacy Proxy</category></item><item><title>WAF - WAF Release - 2026-04-15</title><link>https://developers.cloudflare.com/changelog/post/2026-04-15-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-15-waf-release/</guid><description>
&lt;p&gt;This week&apos;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).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;FortiClient EMS (CVE-2026-21643): A critical vulnerability in the FortiClient EMS permitting unauthorized access or administrative configuration manipulation via crafted HTTP requests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;7767165cda1841b8b6e5abb7aef9415b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...aef9415b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Cisco Secure FMC - RCE via upgradeReadinessCall - CVE:CVE-2026-20079&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;3dd0b2b6f45c4bc08e49bf27ee7be621&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ee7be621&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;FortiClient EMS - Pre-Auth SQL Injection - CVE:CVE-2026-21643&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;0e3a6828906c4b24bad318a9c953a72b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...c953a72b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Mesop - Remote Code Execution - Base64 Payload - CVE:CVE-2026-33057&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;d95aa5410d1b4e98bf7a59d150c08f6f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...50c08f6f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;React Server - DOS - CVE:CVE-2026-23864 - 1 - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule has been merged into the original rule &quot;React Server - DOS - CVE:CVE-2026-23864 - 1&quot; (ID: &lt;rule-id id=&quot;aaede80b4d414dc89c443cea61680354&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...61680354&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;7d6757e8a28f4853a72b4ce6ebd81645&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ebd81645&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XSS, HTML Injection - Link Tag - URI (beta)&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;5e69d599ad634c81abe36a5f0af34bba&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...0af34bba&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XSS, HTML Injection - Embed Tag  - URI (beta)&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Wed, 15 Apr 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Data Loss Prevention - DLP account-level settings</title><link>https://developers.cloudflare.com/changelog/post/2025-04-14-account-level-dlp-settings/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-04-14-account-level-dlp-settings/</guid><description>&lt;p&gt;&lt;strong&gt;Account-level DLP settings are now available&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;Key changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Consistent enforcement&lt;/strong&gt;: Settings configured at the account level apply to all DLP profiles&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplified migration&lt;/strong&gt;: Settings enabled on any profile are automatically migrated to account level&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deprecation notice&lt;/strong&gt;: Profile-level advanced settings will be deprecated in a future release&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Migration details:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-settings/&quot;&gt;DLP settings documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 14 Apr 2026 12:00:00 GMT</pubDate><product>Data Loss Prevention</product><category>Data Loss Prevention</category></item><item><title>Browser Run - Manage Browser Rendering sessions with Wrangler CLI</title><link>https://developers.cloudflare.com/changelog/post/2026-04-14-browser-wrangler-commands/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-14-browser-wrangler-commands/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/&quot;&gt;Browser Rendering&lt;/a&gt; now supports &lt;code&gt;wrangler browser&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;The following commands are available:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler browser create&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a new browser session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler browser close&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Close a session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler browser list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List active sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler browser view&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;View a live browser session&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;create&lt;/code&gt; command spins up a browser instance on Cloudflare&apos;s network and returns a session URL. Once created, you can connect to the session using any &lt;a href=&quot;https://developers.cloudflare.com/browser-run/cdp/&quot;&gt;CDP&lt;/a&gt;-compatible client like &lt;a href=&quot;https://developers.cloudflare.com/browser-run/cdp/puppeteer/&quot;&gt;Puppeteer&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/browser-run/cdp/playwright/&quot;&gt;Playwright&lt;/a&gt;, or &lt;a href=&quot;https://developers.cloudflare.com/browser-run/cdp/mcp-clients/&quot;&gt;MCP clients&lt;/a&gt; to automate browsing, scrape content, or debug remotely.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; browser&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Use &lt;code&gt;--keepAlive&lt;/code&gt; to set the session keep-alive duration (60-600 seconds):&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; browser&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --keepAlive&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 300&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;The &lt;code&gt;view&lt;/code&gt; command auto-selects when only one session exists, or prompts for selection when multiple sessions are available.&lt;/p&gt;
&lt;p&gt;All commands support &lt;code&gt;--json&lt;/code&gt; for structured output, and because these are CLI commands, you can incorporate them into scripts to automate session management.&lt;/p&gt;
&lt;p&gt;For full usage details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/reference/wrangler-commands/&quot;&gt;Wrangler commands documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>Cloudflare One - Introducing Cloudflare Mesh</title><link>https://developers.cloudflare.com/changelog/post/2026-04-14-cloudflare-mesh/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-14-cloudflare-mesh/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;Cloudflare Mesh&lt;/a&gt; is now available (&lt;a href=&quot;https://blog.cloudflare.com/mesh/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;blog post&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;). 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2070,height=875,format=webp/_astro/mesh-network-map.CED6jNHK.gif&quot; alt=&quot;Cloudflare Mesh network map showing nodes and devices connected through Cloudflare&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2070&quot; height=&quot;875&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-cloudflare-mesh-does&quot;&gt;What Cloudflare Mesh does&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-cloudflare-mesh-does&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Assigns a private &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/#mesh-ips&quot;&gt;Mesh IP&lt;/a&gt; to every enrolled device and node.&lt;/li&gt;
&lt;li&gt;Enables any participant to reach any other participant by IP — including client-to-client, without deploying any infrastructure.&lt;/li&gt;
&lt;li&gt;Supports &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/&quot;&gt;CIDR routes&lt;/a&gt; for subnet routing through Mesh nodes.&lt;/li&gt;
&lt;li&gt;Supports &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/high-availability/&quot;&gt;high availability&lt;/a&gt; with active-passive replicas for nodes with routes.&lt;/li&gt;
&lt;li&gt;All traffic flows through Cloudflare, so &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/&quot;&gt;Gateway network policies&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/&quot;&gt;device posture checks&lt;/a&gt;, and access rules apply to every connection.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-changed&quot;&gt;What changed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WARP Connector&lt;/strong&gt; is now &lt;strong&gt;Cloudflare Mesh&lt;/strong&gt;. Existing WARP Connectors are now called mesh nodes. All existing deployments continue to work — no migration required.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Peer-to-peer connectivity&lt;/strong&gt; is now called &lt;strong&gt;Mesh connectivity&lt;/strong&gt; and is part of the Cloudflare Mesh documentation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mesh node limit&lt;/strong&gt; increased from 10 to &lt;strong&gt;50 per account&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;New &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/mesh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;dashboard experience&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; at &lt;strong&gt;Networking&lt;/strong&gt; &amp;gt; &lt;strong&gt;Mesh&lt;/strong&gt; with an interactive network map, node management, route configuration, diagnostics, and a setup wizard.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;Cloudflare Mesh documentation&lt;/a&gt; to set up your first Mesh network.&lt;/p&gt;</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category></item><item><title>Data Loss Prevention - Detect Cloudflare API tokens with DLP</title><link>https://developers.cloudflare.com/changelog/post/2026-04-14-cloudflare-api-token-detections/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-14-cloudflare-api-token-detections/</guid><description>&lt;p&gt;The &lt;strong&gt;Credentials and Secrets&lt;/strong&gt; DLP profile now includes three new predefined entries for detecting Cloudflare API credentials:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Entry name&lt;/th&gt;
&lt;th&gt;Token prefix&lt;/th&gt;
&lt;th&gt;Detects&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare User API Key&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cfk_&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User-scoped API keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare User API Token&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cfut_&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User-scoped API tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Account Owned API Token&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cfat_&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Account-scoped API tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;These detections target the new &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/get-started/token-formats/&quot;&gt;Cloudflare API credential format&lt;/a&gt;, 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 &lt;code&gt;Authorization: Bearer&lt;/code&gt; headers is required.&lt;/p&gt;
&lt;p&gt;Credentials generated before this format change will not be matched by these entries.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;how-to-enable-cloudflare-api-token-detections&quot;&gt;How to enable Cloudflare API token detections&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#how-to-enable-cloudflare-api-token-detections&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;In the &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, go to &lt;strong&gt;Zero Trust&lt;/strong&gt; &amp;gt; &lt;strong&gt;DLP&lt;/strong&gt; &amp;gt; &lt;strong&gt;DLP Profiles&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;Credentials and Secrets&lt;/strong&gt; profile.&lt;/li&gt;
&lt;li&gt;Turn on one or more of the new Cloudflare API token entries.&lt;/li&gt;
&lt;li&gt;Use the profile in a Gateway HTTP policy to log or block traffic containing these credentials.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Example policy:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Selector&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DLP Profile&lt;/td&gt;
&lt;td&gt;in&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Credentials and Secrets&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;Block&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;You can also enable individual entries to scope detection to specific credential types — for example, enabling &lt;strong&gt;Account Owned API Token&lt;/strong&gt; detection without enabling &lt;strong&gt;User API Key&lt;/strong&gt; detection.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/predefined-profiles/&quot;&gt;predefined DLP profiles&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><product>Data Loss Prevention</product><category>Data Loss Prevention</category></item><item><title>Gateway, Data Loss Prevention - Configure how sensitive data appears in DLP payload logs</title><link>https://developers.cloudflare.com/changelog/post/2026-04-14-configurable-payload-log-masking/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-14-configurable-payload-log-masking/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To get started, go to the &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, select &lt;strong&gt;Zero Trust&lt;/strong&gt; &amp;gt; &lt;strong&gt;Data loss prevention&lt;/strong&gt; &amp;gt; &lt;strong&gt;DLP settings&lt;/strong&gt; and find the &lt;strong&gt;Payload log masking&lt;/strong&gt; card.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Full Mask (default):&lt;/strong&gt; Masks the match while preserving character count and visual formatting (for example, &lt;code&gt;***-**-****&lt;/code&gt; for a Social Security Number). This is an improvement over the previous default, which did not preserve character count.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partial Mask:&lt;/strong&gt; Reveals 25% of the matched content while masking the remainder (for example, &lt;code&gt;***-**-6789&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear Text:&lt;/strong&gt; Stores the full, unmasked violation for deep investigation (for example, &lt;code&gt;123-45-6789&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Applies to all enabled detections:&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-policies/logging-options/#log-the-payload-of-matched-rules&quot;&gt;DLP logging options&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category><category>Data Loss Prevention</category></item><item><title>Cloudflare Fundamentals - Improved OAuth experience for consent and management</title><link>https://developers.cloudflare.com/changelog/post/2026-04-14-oauth-consent-and-revoke/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-14-oauth-consent-and-revoke/</guid><description>&lt;p&gt;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 &lt;strong&gt;granular control&lt;/strong&gt; over which accounts these applications can access, plus the ability to revoke access anytime.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;choose-which-accounts-to-authorize&quot;&gt;Choose which accounts to authorize&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#choose-which-accounts-to-authorize&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When authorizing an OAuth application, you can now &lt;strong&gt;select specific accounts&lt;/strong&gt; instead of granting access to all your accounts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Account-by-account selection&lt;/strong&gt; — Choose exactly which accounts the application can access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&quot;All accounts&quot; option&lt;/strong&gt; — Still available for trusted tools like Wrangler
This gives you precise control who can access your data.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;clear-consent-screens&quot;&gt;Clear consent screens&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#clear-consent-screens&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The OAuth consent screen now shows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What the application can access&lt;/strong&gt; — Explicit list of permissions being requested&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Who created the application&lt;/strong&gt; — Application owner and contact information&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Which accounts you&apos;re authorizing&lt;/strong&gt; — Checkboxes for account selection&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;revoke-access-anytime&quot;&gt;Revoke access anytime&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#revoke-access-anytime&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Manage authorized OAuth applications from your profile:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;See all connected apps&lt;/strong&gt; — View every OAuth application with access to your accounts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review permissions and scope&lt;/strong&gt; — Check what each application can do and which accounts it can access&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Revoke instantly&lt;/strong&gt; — Remove access with one click when you no longer need it
To manage your OAuth applications, navigate to &lt;strong&gt;Profile&lt;/strong&gt; &amp;gt; &lt;strong&gt;Access Management&lt;/strong&gt; &amp;gt; &lt;strong&gt;&lt;a href=&quot;https://dash.cloudflare.com/profile/access-management/authorization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Connected Applications&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;why-this-matters&quot;&gt;Why this matters&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#why-this-matters&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;These updates give you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Granular control&lt;/strong&gt; — Authorize apps per-account instead of all-or-nothing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transparency&lt;/strong&gt; — Know exactly what you&apos;re authorizing before you consent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security&lt;/strong&gt; — Limit blast radius by restricting access to only necessary accounts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy cleanup&lt;/strong&gt; — Revoke access when applications are no longer needed&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;learn-more&quot;&gt;Learn more&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#learn-more&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Read more about these improvements in our blog post: &lt;a href=&quot;https://blog.cloudflare.com/improved-developer-security/#improving-the-oauth-consent-experience&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Improving the OAuth consent experience&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>logpush, Logs - Logpush to BigQuery — Cloudflare dashboard support</title><link>https://developers.cloudflare.com/changelog/post/2026-04-14-bigquery-dashboard-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-14-bigquery-dashboard-support/</guid><description>&lt;p&gt;You can now configure Logpush jobs to Google BigQuery directly from the Cloudflare dashboard, in addition to the existing API-based setup.&lt;/p&gt;
&lt;p&gt;Previously, setting up a BigQuery Logpush destination required using the Logpush API. Now you can create and manage BigQuery Logpush jobs from the &lt;strong&gt;Logpush&lt;/strong&gt; page in the Cloudflare dashboard by selecting &lt;strong&gt;Google BigQuery&lt;/strong&gt; as the destination and entering your Google Cloud project ID, dataset ID, table ID, and service account credentials.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/enable-destinations/bigquery/&quot;&gt;Enable Logpush to Google BigQuery&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><product>logpush</product><category>logpush</category><category>Logs</category></item><item><title>Radar - Generate citations on Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-04-14-radar-citations/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-14-radar-citations/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; shareable widgets now include a &lt;strong&gt;generate citation&lt;/strong&gt; action, making it easier to reference &lt;a href=&quot;https://radar.cloudflare.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Radar&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; data in research papers and other publications.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=548,height=308,format=webp/_astro/citation-action-icon.B2QPGPhA.png&quot; alt=&quot;Screenshot of the generate citation icon in the widget action bar&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;548&quot; height=&quot;308&quot;&gt;
&lt;p&gt;Select the citation icon to open a modal with five supported citation styles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BibTeX&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;APA&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MLA&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chicago&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RIS&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1432,height=800,format=webp/_astro/citation-modal.Bf5eDHwO.png&quot; alt=&quot;Screenshot of the citation modal with format options&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1432&quot; height=&quot;800&quot;&gt;
&lt;p&gt;Explore the feature on any shareable widget at &lt;a href=&quot;https://radar.cloudflare.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Radar&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>WAF - Email obfuscation decode script is now non-render-blocking</title><link>https://developers.cloudflare.com/changelog/post/2026-04-14-email-obfuscation-defer/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-14-email-obfuscation-defer/</guid><description>&lt;p&gt;The decode script injected by &lt;a href=&quot;https://developers.cloudflare.com/waf/tools/scrape-shield/email-address-obfuscation/&quot;&gt;Email Address Obfuscation&lt;/a&gt; now loads with the &lt;code&gt;defer&lt;/code&gt; 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 &lt;code&gt;DOMContentLoaded&lt;/code&gt; event.&lt;/p&gt;
&lt;p&gt;This improves page loading performance, contributing to better Core Web Vitals, for all zones with Email Address Obfuscation on. No action is required.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers VPC - VPC Networks and Cloudflare Mesh support now in public beta</title><link>https://developers.cloudflare.com/changelog/post/2026-04-14-vpc-networks/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-14-vpc-networks/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/&quot;&gt;VPC Network&lt;/a&gt; bindings now give your Workers access to any service in your private network without pre-registering individual hosts or ports. This complements existing &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/configuration/vpc-services/&quot;&gt;VPC Service&lt;/a&gt; bindings, which scope each binding to a specific host and port.&lt;/p&gt;
&lt;p&gt;You can bind to a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; by &lt;code&gt;tunnel_id&lt;/code&gt; to reach any service on the network where that tunnel is running, or bind to your &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;Cloudflare Mesh&lt;/a&gt; network using &lt;code&gt;cf1:network&lt;/code&gt; to reach any Mesh node, client device, or subnet route in your account:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;vpc_networks&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MESH&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;network_id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf1:network&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;remote&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;vpc_networks&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MESH&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;network_id = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf1:network&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;remote = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;At runtime, &lt;code&gt;fetch()&lt;/code&gt; routes through the network to reach the service at the IP and port you specify:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MESH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;http://10.0.1.50:8080/api/data&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For configuration options and examples, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/configuration/vpc-networks/&quot;&gt;VPC Networks&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/examples/connect-to-cloudflare-mesh/&quot;&gt;Connect Workers to Cloudflare Mesh&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><product>Workers VPC</product><category>Workers VPC</category></item><item><title>Containers - Containers and Sandboxes are now generally available</title><link>https://developers.cloudflare.com/changelog/post/2026-04-13-containers-sandbox-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-13-containers-sandbox-ga/</guid><description>&lt;p&gt;Cloudflare &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt; are now generally available.&lt;/p&gt;
&lt;p&gt;Containers let you run more workloads on the Workers platform, including resource-intensive applications, different languages, and CLI tools that need full Linux environments.&lt;/p&gt;
&lt;p&gt;Since the initial launch of Containers, there have been significant improvements to Containers&apos; performance, stability, and feature set. Some highlights include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-02-25-higher-container-resource-limits/&quot;&gt;Higher limits&lt;/a&gt; allow you to run thousands of containers concurrently.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2025-11-21-new-cpu-pricing/&quot;&gt;Active-CPU pricing&lt;/a&gt; means that you only pay for used CPU cycles.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-03-26-outbound-workers/&quot;&gt;Easy connections to Workers and other bindings&lt;/a&gt; via hostnames help you extend your Containers with additional functionality.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-03-24-docker-hub-images/&quot;&gt;Docker Hub support&lt;/a&gt; makes it easy to use your existing images and registries.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-03-12-ssh-support/&quot;&gt;SSH support&lt;/a&gt; helps you access and debug issues in live containers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandbox SDK&lt;/a&gt; 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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2025-08-05-sandbox-sdk-major-update/&quot;&gt;Live preview URLs&lt;/a&gt; so agents can run long-lived services and verify in-flight changes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2025-08-05-sandbox-sdk-major-update/&quot;&gt;Persistent code interpreters&lt;/a&gt; for Python, JavaScript, and TypeScript, with rich structured outputs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-02-09-pty-terminal-support/&quot;&gt;Interactive PTY terminals&lt;/a&gt; for real browser-based terminal access with multiple isolated shells per sandbox.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-02-23-sandbox-backup-restore-api/&quot;&gt;Backup and restore APIs&lt;/a&gt; to snapshot a workspace and quickly restore an agent&apos;s coding session without repeating expensive setup steps.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/changelog/post/2026-03-03-sandbox-watch-file-events/&quot;&gt;Real-time filesystem watching&lt;/a&gt; so apps and agents can react immediately to file changes inside a sandbox.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandbox SDK&lt;/a&gt; documentation.&lt;/p&gt;</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Containers, Agents - Secure credential injection and dynamic egress policies for Sandboxes</title><link>https://developers.cloudflare.com/changelog/post/2026-04-13-sandbox-outbound-workers-tls-auth/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-13-sandbox-outbound-workers-tls-auth/</guid><description>&lt;p&gt;Outbound Workers for &lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;credential-injection&quot;&gt;Credential injection&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#credential-injection&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MySandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Sandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;MySandbox.outboundByHost &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;github.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; OutboundHandlerContext&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; requestWithAuth&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		requestWithAuth.headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;x-auth-token&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;SECRET&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(requestWithAuth);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;You can easily inject unique credentials for different instances
by using &lt;code&gt;ctx.containerId&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;MySandbox.outboundByHost &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;my-internal-vcs.dev&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		request&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; OutboundHandlerContext&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; authKey&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;KEYS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(ctx.containerId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; requestWithAuth&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		requestWithAuth.headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;x-auth-token&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, authKey);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(requestWithAuth);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;No token is ever passed into the sandbox. You can rotate secrets in the Worker environment
and every request will pick them up immediately.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;tls-interception&quot;&gt;TLS interception&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#tls-interception&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;With TLS interception active, outbound Workers can act as a transparent proxy for both HTTP and HTTPS traffic.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;allow-and-deny-hosts&quot;&gt;Allow and deny hosts&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#allow-and-deny-hosts&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Easily filter outbound traffic with &lt;code&gt;allowedHosts&lt;/code&gt; and &lt;code&gt;deniedHosts&lt;/code&gt;. When &lt;code&gt;allowedHosts&lt;/code&gt; is set, it becomes a deny-by-default allowlist. Both properties support glob patterns.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MySandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Sandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	allowedHosts&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;github.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;npmjs.org&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;dynamic-outbound-handlers&quot;&gt;Dynamic outbound handlers&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#dynamic-outbound-handlers&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Define named outbound handlers then apply or remove them at runtime using &lt;code&gt;setOutboundHandler()&lt;/code&gt; or &lt;code&gt;setOutboundByHost()&lt;/code&gt;. This lets you change egress policy for a running sandbox without restarting it.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MySandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Sandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;MySandbox.outboundHandlers &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	allowHosts&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; OutboundHandlerContext&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; url&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; URL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(req.url);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (ctx.params.allowedHostnames.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(url.hostname)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(req);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { status: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;403&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	noHttp&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { status: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;403&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Apply handlers programmatically from your Worker:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; sandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getSandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env.Sandbox, userId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Open network for setup&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;setOutboundHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;allowHosts&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	allowedHostnames: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;github.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;npmjs.org&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;npm install&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Lock down after setup&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;setOutboundHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;noHttp&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Handlers accept &lt;code&gt;params&lt;/code&gt;, so you can customize behavior per instance without defining separate handler functions.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Upgrade to &lt;code&gt;@cloudflare/containers@0.3.0&lt;/code&gt; or &lt;code&gt;@cloudflare/sandbox@0.8.9&lt;/code&gt; to use these features.&lt;/p&gt;
&lt;p&gt;For more details, refer to &lt;a href=&quot;https://developers.cloudflare.com/sandbox/guides/outbound-traffic/&quot;&gt;Sandbox outbound traffic&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/outbound-traffic/&quot;&gt;Container outbound traffic&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category><category>Agents</category></item><item><title>Workers - Local Explorer for local resource data</title><link>https://developers.cloudflare.com/changelog/post/2026-04-13-local-explorer/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-13-local-explorer/</guid><description>&lt;p&gt;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 &lt;code&gt;.wrangler/state&lt;/code&gt; to understand what data your Worker has stored locally.&lt;/p&gt;
&lt;p&gt;Local Explorer is available in Wrangler 4.82.1+ and the Cloudflare Vite plugin 1.32.0+. Start a local development session and press &lt;code&gt;e&lt;/code&gt; in your terminal, or navigate to &lt;code&gt;/cdn-cgi/explorer&lt;/code&gt; on your local dev server.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;supported-resources&quot;&gt;Supported resources&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#supported-resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Local Explorer supports five resource types and works across multiple workers running locally:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/kv/&quot;&gt;KV&lt;/a&gt;&lt;/strong&gt; — Browse keys, view values and metadata, create, update, and delete key-value pairs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt;&lt;/strong&gt; — List objects, view metadata, upload files, and delete objects. Supports directory views and multi-select.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/d1/&quot;&gt;D1&lt;/a&gt;&lt;/strong&gt; — Browse tables and rows, run arbitrary SQL queries, and edit schemas in a full data studio.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt;&lt;/strong&gt; (SQLite storage) — Browse individual object SQLite tables, run SQL queries, and edit schemas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt;&lt;/strong&gt; — List instances, view status and step history, trigger new runs, and pause, resume, restart, or terminate instances.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;openapi-powered-rest-api&quot;&gt;OpenAPI-powered REST API&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#openapi-powered-rest-api&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Local Explorer exposes a REST API at &lt;code&gt;/cdn-cgi/explorer/api&lt;/code&gt; that provides programmatic access to the same operations available in the browser. The root endpoint returns an &lt;a href=&quot;https://www.openapis.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OpenAPI specification&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; describing all available endpoints, parameters, and response formats.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; http://localhost:8787/cdn-cgi/explorer/api&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Point an AI coding agent at &lt;code&gt;/cdn-cgi/explorer/api&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/local-development/local-explorer/&quot;&gt;Local Explorer documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Browser Isolation - Canvas Remoting optimizes performance for productivity applications</title><link>https://developers.cloudflare.com/changelog/post/2026-04-10-canvas-remoting-performance/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-10-canvas-remoting-performance/</guid><description>&lt;p&gt;Remote Browser Isolation now supports &lt;strong&gt;Canvas Remoting&lt;/strong&gt;, improving performance for HTML5 Canvas applications by sending vector draw commands instead of rasterized bitmaps.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-improvements&quot;&gt;Key improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;10x bandwidth reduction:&lt;/strong&gt; Microsoft Word and other Office apps use 90% less bandwidth&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smooth performance:&lt;/strong&gt; Google Sheets maintains consistent 30fps rendering&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Responsive terminals:&lt;/strong&gt; Web-based development environments and AI notebooks work in real-time&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero configuration:&lt;/strong&gt; Enabled by default for all Browser Isolation customers&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;how-it-works&quot;&gt;How it works&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#how-it-works&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Instead of sending rasterized bitmaps for every Canvas update, Browser Isolation now:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Captures Canvas draw commands at the source&lt;/li&gt;
&lt;li&gt;Converts them to lightweight vector instructions&lt;/li&gt;
&lt;li&gt;Renders Canvas content on the client&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This reduces bandwidth from hundreds of kilobytes per second to tens of kilobytes per second.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;managing-canvas-remoting&quot;&gt;Managing Canvas Remoting&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#managing-canvas-remoting&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To temporarily disable for troubleshooting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right-click the isolated webpage background&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Disable Canvas Remoting&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Re-enable the same way by selecting &lt;strong&gt;Enable Canvas Remoting&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;limitations&quot;&gt;Limitations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#limitations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Currently supports 2D Canvas contexts only. WebGL and 3D graphics applications continue using bitmap rendering. For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/canvas-remoting/&quot;&gt;Canvas Remoting&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate><product>Browser Isolation</product><category>Browser Isolation</category></item><item><title>Browser Run - Browser Rendering adds Chrome DevTools Protocol (CDP) and MCP client support</title><link>https://developers.cloudflare.com/changelog/post/2026-04-10-browser-rendering-cdp-endpoint/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-10-browser-rendering-cdp-endpoint/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/&quot;&gt;Browser Rendering&lt;/a&gt; now exposes the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/cdp/&quot;&gt;Chrome DevTools Protocol (CDP)&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;Any CDP-compatible client, including &lt;a href=&quot;https://developers.cloudflare.com/browser-run/cdp/puppeteer/&quot;&gt;Puppeteer&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/browser-run/cdp/playwright/&quot;&gt;Playwright&lt;/a&gt;, can connect from any environment, whether that is &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Cloudflare Workers&lt;/a&gt;, your local machine, or a cloud environment. All you need is your Cloudflare API key.&lt;/p&gt;
&lt;p&gt;For any existing CDP script, switching to Browser Rendering is a one-line change:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; puppeteer&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; require&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;puppeteer-core&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; browser&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; puppeteer.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;connect&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	browserWSEndpoint: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`wss://api.cloudflare.com/client/v4/accounts/${&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}/browser-rendering/devtools/browser?keep_alive=600000`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	headers: { Authorization: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Bearer ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; page&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; browser.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;newPage&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; page.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;goto&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; page.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; browser.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Additionally, MCP clients like Claude Desktop, Claude Code, Cursor, and OpenCode can now use Browser Rendering as their remote browser via the &lt;a href=&quot;https://github.com/ChromeDevTools/chrome-devtools-mcp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;chrome-devtools-mcp&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; package.&lt;/p&gt;
&lt;p&gt;Here is an example of how to configure Browser Rendering for Claude Desktop:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;mcpServers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;browser-rendering&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;npx&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				&quot;-y&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				&quot;chrome-devtools-mcp@latest&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				&quot;--wsEndpoint=wss://api.cloudflare.com/client/v4/accounts/&amp;lt;ACCOUNT_ID&amp;gt;/browser-rendering/devtools/browser?keep_alive=600000&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				&quot;--wsHeaders={&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;Authorization&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;Bearer &amp;lt;API_TOKEN&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/cdp/&quot;&gt;CDP documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>Cloudflare Fundamentals - API tokens now detectable by secret scanning tools</title><link>https://developers.cloudflare.com/changelog/post/2026-04-10-secret-scanning-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-10-secret-scanning-support/</guid><description>&lt;p&gt;Cloudflare API tokens now include &lt;strong&gt;identifiable patterns&lt;/strong&gt; that enable secret scanning tools to automatically detect them when leaked in code repositories, configuration files, or other public locations.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-changed&quot;&gt;What changed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;why-this-matters&quot;&gt;Why this matters&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#why-this-matters&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Leaked credentials are a common security risk. By making Cloudflare tokens detectable by scanning tools, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Detect leaks faster&lt;/strong&gt; — Get notified immediately when a token is exposed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduce risk window&lt;/strong&gt; — Exposed tokens are deactivated immediately, before they can be exploited.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automate security&lt;/strong&gt; — Leverage existing secret scanning infrastructure without additional configuration.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-happens-when-a-leak-is-detected&quot;&gt;What happens when a leak is detected&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-happens-when-a-leak-is-detected&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When a third-party secret scanning tool detects a leaked Cloudflare API token:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare immediately deactivates the token&lt;/strong&gt; to prevent unauthorized access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The token creator receives an email notification&lt;/strong&gt; alerting them to the leak.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The token is marked as &quot;Exposed&quot;&lt;/strong&gt; in the Cloudflare dashboard.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You can then roll or delete the token&lt;/strong&gt; from the token management pages.&lt;/li&gt;
&lt;/ol&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;supported-platforms&quot;&gt;Supported platforms&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#supported-platforms&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub Secret Scanning&lt;/strong&gt; — Automatically enabled for public repositories&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information on token formats and secret scanning, refer to &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/get-started/token-formats/&quot;&gt;API token formats&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 10 Apr 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>CASB - Send CASB posture finding instances with webhooks</title><link>https://developers.cloudflare.com/changelog/post/2026-04-09-casb-webhooks/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-09-casb-webhooks/</guid><description>&lt;p&gt;You can now use &lt;strong&gt;CASB webhooks&lt;/strong&gt; in Cloudflare One to send posture finding instances to external systems such as chat platforms, ticketing systems, SIEMs, SOAR tools, and custom automation services.&lt;/p&gt;
&lt;p&gt;This gives security teams a simple way to route CASB posture findings into the tools and workflows they already use for triage and response.&lt;/p&gt;
&lt;p&gt;To get started, go to &lt;strong&gt;Integrations&lt;/strong&gt; &amp;gt; &lt;strong&gt;Webhooks&lt;/strong&gt; in the Cloudflare One dashboard to create a webhook destination. After you configure a webhook, open a posture finding instance and select &lt;strong&gt;Send webhook&lt;/strong&gt; to send it.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-capabilities&quot;&gt;Key capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Flexible authentication&lt;/strong&gt; — Configure destinations using &lt;strong&gt;None&lt;/strong&gt;, &lt;strong&gt;Basic Auth&lt;/strong&gt;, &lt;strong&gt;Bearer Auth&lt;/strong&gt;, &lt;strong&gt;Static Headers&lt;/strong&gt;, or &lt;strong&gt;HMAC-Signing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built-in testing&lt;/strong&gt; — Use &lt;strong&gt;Test delivery&lt;/strong&gt; to send a test request before sending a live finding instance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Posture finding workflows&lt;/strong&gt; — Send posture finding instances directly from the finding details workflow in &lt;strong&gt;Cloud &amp;amp; SaaS findings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTPS destinations&lt;/strong&gt; — Configure webhook destinations with public &lt;code&gt;https://&lt;/code&gt; URLs.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;learn-more&quot;&gt;Learn more&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#learn-more&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Configure &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/cloud-and-saas/webhooks/&quot;&gt;CASB webhooks&lt;/a&gt; in Cloudflare.&lt;/li&gt;
&lt;li&gt;Learn how to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/cloud-and-saas-findings/manage-findings/&quot;&gt;manage findings&lt;/a&gt; in Cloudflare.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CASB webhooks are now available in Cloudflare One.&lt;/p&gt;</description><pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate><product>CASB</product><category>CASB</category></item><item><title>Workers - Relaxed simultaneous connection limiting for Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-04-09-relaxed-connection-limiting/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-09-relaxed-connection-limiting/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/limits/#simultaneous-open-connections&quot;&gt;simultaneous open connections limit&lt;/a&gt; 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 &quot;waiting for headers&quot; phase simultaneously.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;before-new-connections-are-blocked-until-an-earlier-connection-fully-completes&quot;&gt;Before: New connections are blocked until an earlier connection fully completes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#before-new-connections-are-blocked-until-an-earlier-connection-fully-completes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=820,height=500,format=svg/_astro/connection-limit-before.BYti-Sxe.svg&quot; alt=&quot;A 7th fetch is queued until an earlier connection fully completes, including reading its entire response body&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;820&quot; height=&quot;500&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;after-new-connections-can-start-as-soon-as-response-headers-arrive&quot;&gt;After: New connections can start as soon as response headers arrive&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#after-new-connections-can-start-as-soon-as-response-headers-arrive&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=820,height=500,format=svg/_astro/connection-limit-after.BfVRyLE8.svg&quot; alt=&quot;A 7th fetch starts as soon as any earlier connection receives its response headers&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;820&quot; height=&quot;500&quot;&gt;
&lt;p&gt;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 &lt;code&gt;Response closed due to connection limit&lt;/code&gt; exception that could previously occur when the runtime canceled stalled connections to prevent deadlocks.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;Content-Encoding: gzip&lt;/code&gt;, the runtime&apos;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;before-connections-could-be-canceled-during-brief-internal-pauses&quot;&gt;Before: Connections could be canceled during brief internal pauses&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#before-connections-could-be-canceled-during-brief-internal-pauses&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=820,height=260,format=svg/_astro/connection-cancel-before.D4As_PDP.svg&quot; alt=&quot;A connection with gaps from gzip decompression appears idle and is canceled by the runtime&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;820&quot; height=&quot;260&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;after-connections-complete-normally-regardless-of-internal-pauses&quot;&gt;After: Connections complete normally regardless of internal pauses&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#after-connections-complete-normally-regardless-of-internal-pauses&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=820,height=230,format=svg/_astro/connection-cancel-after.RdmZLNge.svg&quot; alt=&quot;The same connection completes normally because the body phase is no longer counted against the limit&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;820&quot; height=&quot;230&quot;&gt;</description><pubDate>Thu, 09 Apr 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Search - Website Source CSS content selectors for precise content extraction in AI Search</title><link>https://developers.cloudflare.com/changelog/post/2026-04-09-ai-search-content-selectors/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-09-ai-search-content-selectors/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now supports &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/website/content-selectors/&quot;&gt;CSS content selectors&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Configure content selectors via the dashboard or API:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/{account_id}/ai-search/instances&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer {api_token}&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;id&quot;: &quot;my-ai-search&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;source&quot;: &quot;https://example.com&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;type&quot;: &quot;web-crawler&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;source_params&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;web_crawler&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;parse_options&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;          &quot;content_selector&quot;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;            {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;              &quot;path&quot;: &quot;**/blog/**&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;              &quot;selector&quot;: &quot;article .post-body&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;          ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Selectors are evaluated in order, and the first matching pattern wins. You can define up to 10 content selector entries per instance.&lt;/p&gt;
&lt;p&gt;For configuration details and examples, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/website/content-selectors/&quot;&gt;content selectors documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>AI Search - New Workers AI models for text generation and embedding in AI Search</title><link>https://developers.cloudflare.com/changelog/post/2026-04-09-new-workers-ai-models/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-09-new-workers-ai-models/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now supports four additional &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt; models across text generation and embedding.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;text-generation&quot;&gt;Text generation&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#text-generation&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Context window (tokens)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@cf/zai-org/glm-4.7-flash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;131,072&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@cf/qwen/qwen3-30b-a3b-fp8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;32,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;embedding&quot;&gt;Embedding&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#embedding&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Vector dims&lt;/th&gt;
&lt;th&gt;Input tokens&lt;/th&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@cf/qwen/qwen3-embedding-0.6b&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1,024&lt;/td&gt;
&lt;td&gt;4,096&lt;/td&gt;
&lt;td&gt;cosine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@cf/google/embeddinggemma-300m&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;768&lt;/td&gt;
&lt;td&gt;512&lt;/td&gt;
&lt;td&gt;cosine&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For the full list of supported models, refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/models/supported-models/&quot;&gt;Supported models&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Risk Score - User risk scoring for high risk browsing activity</title><link>https://developers.cloudflare.com/changelog/post/2026-04-08-high-risk-browsing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-08-high-risk-browsing/</guid><description>&lt;p&gt;Cloudflare One&apos;s &lt;strong&gt;User Risk Scoring&lt;/strong&gt; now incorporates direct signals from &lt;strong&gt;Gateway DNS traffic patterns&lt;/strong&gt;. This update allows security teams to automatically elevate a user&apos;s risk score when they visit high-risk or malicious domains, providing a more holistic view of internal threats.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;why-this-matters&quot;&gt;Why this matters&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#why-this-matters&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Browsing activity is a primary indicator of potential compromise. By tying Gateway DNS logs to specific users, administrators can now flag individuals interacting with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Security threats&lt;/strong&gt;: Domains associated with malware, phishing, or command-and-control (C2) centers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High-risk content&lt;/strong&gt;: Categories such as questionable content or violence that may violate corporate compliance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even if a Gateway policy is set to &lt;strong&gt;Block&lt;/strong&gt; the traffic, the interaction is still captured as a &quot;hit&quot; to ensure the user&apos;s risk profile reflects the attempted activity.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-risk-behaviors&quot;&gt;New risk behaviors&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-risk-behaviors&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Two new behaviors are now available in the dashboard:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Suspicious Security Domain Visited&lt;/strong&gt;: Triggers when a user visits a domain in the security threats or security risk categories.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High risk domain visited&lt;/strong&gt;: Triggers when a user visits domains categorized as questionable content, violence, or CIPA.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To learn more and get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/users/risk-score/&quot;&gt;User Risk Scoring documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><product>Risk Score</product><category>Risk Score</category></item><item><title>Security Center - Real-time alerts and daily digests for Threat Events</title><link>https://developers.cloudflare.com/changelog/post/2026-04-08-threat-events-notification/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-08-threat-events-notification/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;stay-ahead-of-emerging-threats&quot;&gt;Stay ahead of emerging threats&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#stay-ahead-of-emerging-threats&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;By linking your saved views to the Cloudflare Notifications Center, you can ensure the right information reaches your team at the right time.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Immediate Alerts&lt;/strong&gt;: 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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Daily Digests&lt;/strong&gt;: 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.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2630,height=1424,format=webp/_astro/threat-events-notifications.3Fl8LGOn.png&quot; alt=&quot;Threat Events notifications&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2630&quot; height=&quot;1424&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;how-to-get-started&quot;&gt;How to get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#how-to-get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To set up an alert, go to &lt;strong&gt;Application Security&lt;/strong&gt; &amp;gt; &lt;strong&gt;Threat Intelligence&lt;/strong&gt; &amp;gt; &lt;strong&gt;Threat Events&lt;/strong&gt;. From there:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Choose your datasets and apply your desired filters and select &lt;strong&gt;Save View&lt;/strong&gt; (or select an existing one).&lt;/li&gt;
&lt;li&gt;Open the &lt;strong&gt;Manage Saved Views&lt;/strong&gt; menu.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Add Alert&lt;/strong&gt; next to your chosen view to configure your notification preferences in the Cloudflare dashboard.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For more technical details on configuring notifications, refer to the &lt;a href=&quot;https://developers.cloudflare.com/security-center/cloudforce-one/&quot;&gt;Threat Events documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Cloudflare One Client - Cloudflare One Client for Windows (version 2026.3.851.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-04-07-warp-windows-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-07-warp-windows-ga/</guid><description>&lt;p&gt;A new GA release for the Windows Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes and improvements.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue causing Windows client tunnel interface initialization failure which prevented clients from establishing a tunnel for connection.&lt;/li&gt;
&lt;li&gt;Consumer-only CLI commands are now clearly distinguished from Zero Trust commands.&lt;/li&gt;
&lt;li&gt;Added detailed QUIC connection metrics to diagnostic logs for better troubleshooting.&lt;/li&gt;
&lt;li&gt;Added monitoring for tunnel statistics collection timeouts.&lt;/li&gt;
&lt;li&gt;Switched tunnel congestion control algorithm for local proxy mode to Cubic for improved reliability across platforms.&lt;/li&gt;
&lt;li&gt;Fixed packet capture failing on tunnel interface when the tunnel interface is renamed by SCCM VPN boundary support.&lt;/li&gt;
&lt;li&gt;Fixed unnecessary registration deletion caused by RDP connections in multi-user mode.&lt;/li&gt;
&lt;li&gt;Fixed increased tunnel interface start-up time due to a race between duplicate address detection (DAD) and disabling NetBT.&lt;/li&gt;
&lt;li&gt;Fixed tunnel failing to connect when the system DNS search list contains unexpected characters.&lt;/li&gt;
&lt;li&gt;Empty MDM files are now rejected instead of being incorrectly accepted as a single MDM config.&lt;/li&gt;
&lt;li&gt;Fixed an issue in local proxy mode where the client could become unresponsive due to upstream connection timeouts.&lt;/li&gt;
&lt;li&gt;Fixed an issue where the emergency disconnect status of a prior organization persisted after a switch to a different organization.&lt;/li&gt;
&lt;li&gt;Fixed initiating managed network detections checks when no network is available, which caused device profile flapping.&lt;/li&gt;
&lt;li&gt;Fixed an issue where degraded Windows Management Instrumentation (WMI) state could put the client in a failed connection state loop during initialization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd&quot;&gt;Windows 11 24H2 version KB5062553&lt;/a&gt; or higher for resolution. This warning will be omitted from future release notes. This Windows update was released in July 2025.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Devices with KB5055523 installed may receive a warning about &lt;code&gt;Win32/ClickFix.ABA&lt;/code&gt; being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to &lt;a href=&quot;https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0&quot;&gt;version 1.429.19.0&lt;/a&gt; or later. This warning will be omitted from future release notes. This Microsoft Security Intelligence update was released in May 2025.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS resolution may be broken when the following conditions are all true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The client is in Secure Web Gateway without DNS filtering (tunnel-only) mode.&lt;/li&gt;
&lt;li&gt;A custom DNS server address is configured on the primary network adapter.&lt;/li&gt;
&lt;li&gt;The custom DNS server address on the primary network adapter is changed while the client is connected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To work around this issue, reconnect the client by selecting &lt;strong&gt;Disconnect&lt;/strong&gt; and then &lt;strong&gt;Connect&lt;/strong&gt; in the client user interface.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 07 Apr 2026 15:56:36 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Email security - User Submission Triage Status Tracking</title><link>https://developers.cloudflare.com/changelog/post/2026-04-07-triage-status-tracking/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-07-triage-status-tracking/</guid><description>&lt;p&gt;Cloudflare Email security now supports &lt;strong&gt;Triage Status Tracking for User Submissions&lt;/strong&gt;. This enhancement gives SOC teams a streamlined way to track, manage, and prioritize user-submitted emails directly within the Cloudflare One dashboard.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The User Submissions table now includes a &lt;strong&gt;Status&lt;/strong&gt; column with three states: &lt;strong&gt;Unreviewed&lt;/strong&gt; (new submissions awaiting triage), &lt;strong&gt;Reviewed&lt;/strong&gt; (submissions assessed by the SOC team), and &lt;strong&gt;Escalated&lt;/strong&gt; (submissions escalated to team submissions for further investigation). Analysts can quickly update statuses and filter the table to focus on what needs attention.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Triage Status Tracking is &lt;strong&gt;automatically available&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;This applies to all Email security packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advantage&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise + PhishGuard&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 07 Apr 2026 09:00:00 GMT</pubDate><product>Email security</product><category>Email security</category></item><item><title>Cloudflare One Appliance, Cloudflare One, Cloudflare WAN - Link aggregation (LACP) support for Cloudflare One Appliance</title><link>https://developers.cloudflare.com/changelog/post/2026-04-07-link-aggregation-lacp-appliance/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-07-link-aggregation-lacp-appliance/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;This feature is available in beta on physical appliance hardware with the latest OS. No entitlement is required.&lt;/p&gt;
&lt;p&gt;To configure a Link Aggregation Group, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/network-options/link-aggregation/&quot;&gt;Configure link aggregation groups&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate><product>Cloudflare One Appliance</product><category>Cloudflare One Appliance</category><category>Cloudflare One</category><category>Cloudflare WAN</category></item><item><title>SSL/TLS - Manage mTLS and BYO CA certificates from the Cloudflare dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-04-07-mtls-byoca-dashboard/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-07-mtls-byoca-dashboard/</guid><description>&lt;p&gt;You can now manage mutual TLS (mTLS) and Bring Your Own Certificate Authority
(BYO CA) configurations directly from the Cloudflare dashboard — no API required.&lt;/p&gt;
&lt;p&gt;Previously, these advanced workflows required the Cloudflare API. The following
are now available in the dashboard:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AOP certificate management&lt;/strong&gt; — Upload and manage your own
certificate authorities for &lt;a href=&quot;https://developers.cloudflare.com/ssl/origin-configuration/authenticated-origin-pull/&quot;&gt;Authenticated Origin Pulls (AOP)&lt;/a&gt;
directly from the dashboard.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BYO Client mTLS certificate management&lt;/strong&gt; — Upload and manage your own CA
certificates for &lt;a href=&quot;https://developers.cloudflare.com/ssl/client-certificates/byo-ca/&quot;&gt;client mTLS enforcement&lt;/a&gt;
without needing API access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CDN hostname to client mTLS certificate mapping&lt;/strong&gt; — Associate client mTLS
certificates with specific hostnames directly from the dashboard.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate><product>SSL/TLS</product><category>SSL/TLS</category></item><item><title>Support - Redesigned Support Portal for faster, personalized help</title><link>https://developers.cloudflare.com/changelog/post/2026-04-06-redesigned-support-portal/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-06-redesigned-support-portal/</guid><description>&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;redesigned-get-help-portal-for-faster-personalized-help&quot;&gt;Redesigned &quot;Get Help&quot; Portal for faster, personalized help&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#redesigned-get-help-portal-for-faster-personalized-help&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Cloudflare has officially launched a redesigned &quot;Get Help&quot; 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&apos;s internal taxonomy.&lt;/p&gt;
&lt;p&gt;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 &quot;Ask AI&quot;, &quot;Chat with a human&quot;, or &quot;Community&quot; — without the manual triage.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s New&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;One Page, Clear Choices&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Radically Simpler Support Form&lt;/strong&gt;: We&apos;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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI-Driven Triage&lt;/strong&gt;: Using &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Workers AI&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/vectorize/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Vectorize&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, the portal now automatically generates case subjects and predicts product categories.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;moving-complexity-to-the-backend&quot;&gt;Moving complexity to the backend&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#moving-complexity-to-the-backend&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Behind the scenes, we&apos;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To learn more, refer to the &lt;a href=&quot;https://developers.cloudflare.com/support/contacting-cloudflare-support/&quot;&gt;Support documentation&lt;/a&gt; or select &lt;strong&gt;Get Help&lt;/strong&gt; directly in the &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate><product>Support</product><category>Support</category></item><item><title>WAF - WAF Release - 2026-04-07</title><link>https://developers.cloudflare.com/changelog/post/2026-04-07-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-07-waf-release/</guid><description>
&lt;p&gt;This week&apos;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 &quot;OnEvent&quot; handlers within HTTP cookies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;XSS OnEvents Cookies: This generic rule identifies malicious event handlers (such as onload or onerror) embedded within HTTP cookie values.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;73ae1cf103da4bacaa2e1a610aa410af&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...0aa410af&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Command Execution - 5 - Body&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;a88a85b0cc5a4bc2abead6289131ec2f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...9131ec2f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Command Execution - 5 - Header&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;28518cdc40544979bbd86720551eb9e5&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...551eb9e5&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Command Execution - 5 - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;1177993d53a1467997002b44d46229eb&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d46229eb&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;MCP Server - Remote Code Execution - CVE:CVE-2026-23744&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;3d43cdfbc3c14584942f8bc4a864b9c2&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...a864b9c2&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XSS - OnEvents - Cookies&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;41153470df2365192b0df74ca78ad04e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...a78ad04e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Evasion - Body&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;64d812e6d5844d7c9d7a44a440732d48&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...40732d48&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Evasion - Headers&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;50de9369ef7c45928a5dfb34e68a99b5&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...e68a99b5&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Evasion - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;765ffb5c67b94c9589106c843e8143d2&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...3e8143d2&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - LIKE 3 - Body&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;5c3dbd4f115e47c781491fcd70e7fb97&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...70e7fb97&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - LIKE 3 - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;89fa6027a0334949b1cb2e654c538bd9&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...4c538bd9&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - UNION - 2 - Body&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;05946b3458364f1b9d4819d561c439c9&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...61c439c9&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - UNION - 2 - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;b2fe5c2a39df4609b6d39908cf33ea10&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...cf33ea10&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SolarWinds - Auth Bypass - CVE:CVE-2025-40552&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - WebSockets now automatically reply to Close frames</title><link>https://developers.cloudflare.com/changelog/post/2026-04-07-websocket-auto-reply-to-close/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-07-websocket-auto-reply-to-close/</guid><description>&lt;p&gt;The Workers runtime now automatically sends a reciprocal Close frame when it receives a Close frame from the peer. The &lt;code&gt;readyState&lt;/code&gt; transitions to &lt;code&gt;CLOSED&lt;/code&gt; before the &lt;code&gt;close&lt;/code&gt; event fires. This matches the &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close_event&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WebSocket specification&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and standard browser behavior.&lt;/p&gt;
&lt;p&gt;This change is enabled by default for Workers using compatibility dates on or after &lt;code&gt;2026-04-07&lt;/code&gt; (via the &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/compatibility-flags/#websocket-auto-reply-to-close&quot;&gt;&lt;code&gt;web_socket_auto_reply_to_close&lt;/code&gt;&lt;/a&gt; compatibility flag). Existing code that manually calls &lt;code&gt;close()&lt;/code&gt; inside the &lt;code&gt;close&lt;/code&gt; event handler will continue to work — the call is silently ignored when the WebSocket is already closed.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;] &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Object.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;values&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WebSocketPair&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;server.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;accept&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;server.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;close&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// readyState is already CLOSED — no need to call server.close().&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(server.readyState); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// WebSocket.CLOSED&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(event.code); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// 1000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(event.wasClean); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;half-open-mode-for-websocket-proxying&quot;&gt;Half-open mode for WebSocket proxying&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#half-open-mode-for-websocket-proxying&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;code&gt;{ allowHalfOpen: true }&lt;/code&gt; to &lt;code&gt;accept()&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;server&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;] &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Object.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;values&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WebSocketPair&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;server.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;accept&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ allowHalfOpen: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;server.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;close&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// readyState is still CLOSING here, giving you time&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// to coordinate the close on the other side.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(server.readyState); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// WebSocket.CLOSING&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Manually close when ready.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	server.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(event.code, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;done&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/websockets/#close-behavior&quot;&gt;WebSockets Close behavior&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Email security - DANE Support for MX Deployments</title><link>https://developers.cloudflare.com/changelog/post/2026-04-06-dane-support-mx-deployments/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-06-dane-support-mx-deployments/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This applies to all Email Security packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advantage&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise + PhishGuard&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Mon, 06 Apr 2026 09:00:00 GMT</pubDate><product>Email security</product><category>Email security</category></item><item><title>Cloudflare Fundamentals, Cloudflare One, Gateway, Organizations - Organizations is now in public beta for enterprises</title><link>https://developers.cloudflare.com/changelog/post/2026-04-06-organizations-public-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-06-organizations-public-beta/</guid><description>&lt;p&gt;We&apos;re announcing the public beta of &lt;strong&gt;Organizations&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What&apos;s New&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Organizations [BETA]&lt;/strong&gt;: &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/organizations/&quot;&gt;Organizations&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Self-serve onboarding&lt;/strong&gt;: Enterprise customers can &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/organizations/setup/&quot;&gt;create an Organization&lt;/a&gt; in the dashboard and assign accounts where they are already Super Administrators.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Centralized Account Management&lt;/strong&gt;: 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.
&lt;strong&gt;Shared policies&lt;/strong&gt;: Share &lt;a href=&quot;https://developers.cloudflare.com/waf/custom-rules/&quot;&gt;WAF&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/tiered-policies/organizations/&quot;&gt;Gateway&lt;/a&gt; policies across multiple accounts within your Organization to simplify centralized policy management.
&lt;strong&gt;Implicit access&lt;/strong&gt;: 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unified analytics&lt;/strong&gt;: 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Terraform provider support&lt;/strong&gt;: Manage Organizations with infrastructure as code from day one. Provision organizations, assign accounts, and configure settings programmatically with the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/organization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Terraform provider&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shared policies&lt;/strong&gt;: Share &lt;a href=&quot;https://developers.cloudflare.com/waf/custom-rules/&quot;&gt;WAF&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot;&gt;Gateway&lt;/a&gt; policies across multiple accounts within your Organization to simplify centralized policy management.&lt;/p&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;For more info:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/organizations/&quot;&gt;Get started with Organizations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/organizations/setup/&quot;&gt;Set up your Organization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/organizations/limitations/&quot;&gt;Review limitations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>Cloudflare One</category><category>Gateway</category><category>Organizations</category></item><item><title>Logs - New ResponseTimeMs field in Gateway DNS Logpush dataset</title><link>https://developers.cloudflare.com/changelog/post/2026-04-06-gateway-dns-response-time-ms/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-06-gateway-dns-response-time-ms/</guid><description>&lt;p&gt;Cloudflare has added a new field to the &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/gateway_dns/#responsetimems&quot;&gt;Gateway DNS&lt;/a&gt; Logpush dataset:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ResponseTimeMs&lt;/strong&gt;: Total response time of the DNS request in milliseconds.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the complete field definitions, refer to &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/gateway_dns/&quot;&gt;Gateway DNS dataset&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>Containers - Control where your Containers run with regional and jurisdictional placement</title><link>https://developers.cloudflare.com/changelog/post/2026-04-05-regional-placement/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-05-regional-placement/</guid><description>&lt;p&gt;You can now specify placement constraints to control where your &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt; run.&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Constraint&lt;/th&gt;
&lt;th&gt;Values&lt;/th&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;regions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ENAM&lt;/code&gt;, &lt;code&gt;WNAM&lt;/code&gt;, &lt;code&gt;EEUR&lt;/code&gt;, &lt;code&gt;WEUR&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Geographic placement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jurisdiction&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eu&lt;/code&gt;, &lt;code&gt;fedramp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Compliance boundaries&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Use &lt;code&gt;regions&lt;/code&gt; to limit placement to specific geographic areas. Use &lt;code&gt;jurisdiction&lt;/code&gt; to restrict containers to compliance boundaries — &lt;code&gt;eu&lt;/code&gt; maps to European regions (EEUR, WEUR) and &lt;code&gt;fedramp&lt;/code&gt; maps to North American regions (ENAM, WNAM).&lt;/p&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/placement/&quot;&gt;Containers placement&lt;/a&gt; for more details.&lt;/p&gt;</description><pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Workers AI - Google Gemma 4 26B A4B now available on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2026-04-04-gemma-4-26b-a4b-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-04-gemma-4-26b-a4b-workers-ai/</guid><description>&lt;p&gt;We are partnering with Google to bring &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/gemma-4-26b-a4b-it/&quot;&gt;&lt;code&gt;@cf/google/gemma-4-26b-a4b-it&lt;/code&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Gemma 4 is Google&apos;s most capable family of open models, designed to maximize intelligence-per-parameter.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-capabilities&quot;&gt;Key capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mixture-of-Experts architecture&lt;/strong&gt; 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&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;256,000 token context window&lt;/strong&gt; for retaining full conversation history, tool definitions, and long documents across extended sessions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built-in thinking mode&lt;/strong&gt; that lets the model reason step-by-step before answering, improving accuracy on complex tasks&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vision understanding&lt;/strong&gt; 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&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function calling&lt;/strong&gt; with native support for structured tool use, enabling agentic workflows and multi-step planning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multilingual&lt;/strong&gt; with out-of-the-box support for 35+ languages, pre-trained on 140+ languages&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coding&lt;/strong&gt; for code generation, completion, and correction&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use Gemma 4 26B A4B through the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/bindings/&quot;&gt;Workers AI binding&lt;/a&gt; (&lt;code&gt;env.AI.run()&lt;/code&gt;), the REST API at &lt;code&gt;/run&lt;/code&gt; or &lt;code&gt;/v1/chat/completions&lt;/code&gt;, or the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/open-ai-compatibility/&quot;&gt;OpenAI-compatible endpoint&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/gemma-4-26b-a4b-it/&quot;&gt;Gemma 4 26B A4B model page&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Sat, 04 Apr 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Cloudflare One Client - Cloudflare One Client for macOS (version 2026.3.846.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-04-02-warp-macos-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-02-warp-macos-ga/</guid><description>&lt;p&gt;A new GA release for the macOS Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes and improvements.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Empty MDM files are now rejected instead of being incorrectly accepted as a single MDM config.&lt;/li&gt;
&lt;li&gt;Fixed an issue in local proxy mode where the client could become unresponsive due to upstream connection timeouts.&lt;/li&gt;
&lt;li&gt;Fixed an issue where the emergency disconnect status of a prior organization persisted after a switch to a different organization.&lt;/li&gt;
&lt;li&gt;Consumer-only CLI commands are now clearly distinguished from Zero Trust commands.&lt;/li&gt;
&lt;li&gt;Added detailed QUIC connection metrics to diagnostic logs for better troubleshooting.&lt;/li&gt;
&lt;li&gt;Added monitoring for tunnel statistics collection timeouts.&lt;/li&gt;
&lt;li&gt;Switched tunnel congestion control algorithm for local proxy mode to Cubic for improved reliability across platforms.&lt;/li&gt;
&lt;li&gt;Fixed initiating managed network detections checks when no network is available, which caused device profile flapping.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Thu, 02 Apr 2026 16:28:33 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - Cloudflare One Client for Linux (version 2026.3.846.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-04-02-warp-linux-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-02-warp-linux-ga/</guid><description>&lt;p&gt;A new GA release for the Linux Cloudflare One Client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes and improvements.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Empty MDM files are now rejected instead of being incorrectly accepted as a single MDM config.&lt;/li&gt;
&lt;li&gt;Fixed an issue in local proxy mode where the client could become unresponsive due to upstream connection timeouts.&lt;/li&gt;
&lt;li&gt;Fixed an issue where the emergency disconnect status of a prior organization persisted after a switch to a different organization.&lt;/li&gt;
&lt;li&gt;Consumer-only CLI commands are now clearly distinguished from Zero Trust commands.&lt;/li&gt;
&lt;li&gt;Added detailed QUIC connection metrics to diagnostic logs for better troubleshooting.&lt;/li&gt;
&lt;li&gt;Added monitoring for tunnel statistics collection timeouts.&lt;/li&gt;
&lt;li&gt;Switched tunnel congestion control algorithm for local proxy mode to Cubic for improved reliability across platforms.&lt;/li&gt;
&lt;li&gt;Fixed initiating managed network detections checks when no network is available, which caused device profile flapping.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Thu, 02 Apr 2026 15:39:10 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Access - Session management for MCP server portals</title><link>https://developers.cloudflare.com/changelog/post/2026-04-02-mcp-portal-session-management/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-02-mcp-portal-session-management/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/&quot;&gt;MCP server portals&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;To return to the server selection page, ask your AI agent with a prompt like &quot;take me back to the server selection page.&quot; The portal responds with an authorization URL via &lt;a href=&quot;https://modelcontextprotocol.io/specification/2025-03-26/server/elicitation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MCP elicitation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; that you open in your browser:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;https://&amp;lt;subdomain&amp;gt;.&amp;lt;domain&amp;gt;/authorize?elicitationId=&amp;lt;ELICITATION_ID&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;From the server selection page you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enable or disable servers&lt;/strong&gt; — Toggle individual upstream MCP servers on or off. Disabling a server removes its tools from the active session, which reduces context window usage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log out and reauthenticate&lt;/strong&gt; — Log out of a server and log back in to change which data the server has access to, or to reauthenticate with different permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Users can also enable or disable a server inline by asking their AI agent directly, for example &quot;enable the wiki server&quot; or &quot;disable my Jira server.&quot;&lt;/p&gt;
&lt;p&gt;The portal also automatically prompts connected users to authorize new servers when an admin adds them to the portal. This requires the use of &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/managed-oauth/#enable-managed-oauth-on-an-mcp-server-portal&quot;&gt;managed OAuth&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#manage-portal-sessions&quot;&gt;Manage portal sessions&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>AI Gateway - Automatically retry on upstream provider failures on AI Gateway</title><link>https://developers.cloudflare.com/changelog/post/2026-04-02-auto-retry-upstream-failures/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-02-auto-retry-upstream-failures/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2344,height=502,format=webp/_astro/auto-retry-changelog.DoCXZnDy.png&quot; alt=&quot;Retry Requests settings in the AI Gateway dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2344&quot; height=&quot;502&quot;&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/features/dynamic-routing/&quot;&gt;Dynamic Routing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/configuration/manage-gateway/#retry-requests&quot;&gt;Manage gateways&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Logs - BigQuery as Logpush destination</title><link>https://developers.cloudflare.com/changelog/post/2026-04-02-bigquery-destination/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-02-bigquery-destination/</guid><description>&lt;p&gt;Cloudflare Logpush now supports &lt;strong&gt;BigQuery&lt;/strong&gt; as a native destination.&lt;/p&gt;
&lt;p&gt;Logs from Cloudflare can be sent to &lt;a href=&quot;https://cloud.google.com/bigquery&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Google Cloud BigQuery&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; via &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/&quot;&gt;Logpush&lt;/a&gt;. The destination can be configured through the Logpush UI in the Cloudflare dashboard or by using the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/logpush/subresources/jobs/&quot;&gt;Logpush API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/enable-destinations/bigquery/&quot;&gt;Destination Configuration&lt;/a&gt; documentation.&lt;/p&gt;</description><pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>Workflows, Workers - All Wrangler commands for Workflows now support local development</title><link>https://developers.cloudflare.com/changelog/post/2026-04-01-wrangler-workflows-local/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-01-wrangler-workflows-local/</guid><description>&lt;p&gt;All &lt;code&gt;wrangler workflows&lt;/code&gt; commands now accept a &lt;code&gt;--local&lt;/code&gt; flag to target a Workflow running in a local &lt;code&gt;wrangler dev&lt;/code&gt; session instead of the production API.&lt;/p&gt;
&lt;p&gt;You can now manage the full Workflow lifecycle locally, including triggering Workflows, listing instances, pausing, resuming, restarting, terminating, and sending events:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workflows&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; list&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workflows&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; trigger&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-workflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workflows&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; instances&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; list&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-workflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workflows&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; instances&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; pause&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-workflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;INSTANCE_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workflows&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; instances&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; send-event&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-workflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;INSTANCE_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --type&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-event&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --local&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;All commands also accept &lt;code&gt;--port&lt;/code&gt; to target a specific &lt;code&gt;wrangler dev&lt;/code&gt; session (defaults to &lt;code&gt;8787&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/local-development/&quot;&gt;Workflows local development&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Apr 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>AI Search - Create, manage, search AI Search instances with Wrangler CLI</title><link>https://developers.cloudflare.com/changelog/post/2026-04-01-ai-search-wrangler-commands/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-01-ai-search-wrangler-commands/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; supports a &lt;code&gt;wrangler ai-search&lt;/code&gt; command namespace. Use it to manage instances from the command line.&lt;/p&gt;
&lt;p&gt;The following commands are available:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search create&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a new instance with an interactive wizard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List all instances in your account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search get&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get details of a specific instance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search update&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update the configuration of an instance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search delete&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delete an instance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search search&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run a search query against an instance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler ai-search stats&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get usage statistics for an instance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;create&lt;/code&gt; command guides you through setup, choosing a name, source type (&lt;code&gt;r2&lt;/code&gt; or &lt;code&gt;web&lt;/code&gt;), and data source. You can also pass all options as flags for non-interactive use:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ai-search&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-instance&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --type&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --source&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-bucket&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Use &lt;code&gt;wrangler ai-search search&lt;/code&gt; to query an instance directly from the CLI:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ai-search&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; search&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-instance&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --query&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;how do I configure caching?&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;All commands support &lt;code&gt;--json&lt;/code&gt; for structured output that scripts and AI agents can parse directly.&lt;/p&gt;
&lt;p&gt;For full usage details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/wrangler-commands/&quot;&gt;Wrangler commands documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Cloudflare One, Access, Gateway - Logs UI refresh</title><link>https://developers.cloudflare.com/changelog/post/2026-04-01-logs-ui-refresh/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-01-logs-ui-refresh/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2984,height=842,format=webp/_astro/cf1-new-logs-ui.DxF4x0l-.png&quot; alt=&quot;Screenshot of the new logs UI showing DNS query logs with customizable columns and filtering options&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2984&quot; height=&quot;842&quot;&gt;
&lt;p&gt;The updated UI includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Filter by field&lt;/strong&gt; - Select any field value to add it as a filter and narrow down your results.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customizable fields&lt;/strong&gt; - Choose which fields to display in the log table. Querying for fewer fields improves log loading performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;View details&lt;/strong&gt; - Select a timestamp to view the full details of a log entry.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Switch to classic view&lt;/strong&gt; - Return to the previous log viewer interface if needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/logs/dashboard-logs/access-authentication-logs/&quot;&gt;Access authentication logs&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/logs/dashboard-logs/gateway-logs/&quot;&gt;Gateway activity logs&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category><category>Access</category><category>Gateway</category></item><item><title>Radar - Routing Section Expansion on Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-04-01-radar-routing-section/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-01-radar-routing-section/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; now features an expanded &lt;a href=&quot;https://radar.cloudflare.com/routing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Routing section&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;dedicated-sub-pages&quot;&gt;Dedicated sub-pages&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#dedicated-sub-pages&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The single Routing page has been split into three focused sub-pages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://radar.cloudflare.com/routing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; — Routing statistics, IP address space trends, BGP announcements, and the new Top 100 ASes ranking.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://radar.cloudflare.com/routing/rpki&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;RPKI&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; — RPKI validation status, ASPA deployment trends, and per-ASN ASPA provider details.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://radar.cloudflare.com/routing/anomalies&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Anomalies&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; — BGP route leaks, origin hijacks, and Multi-Origin AS (MOAS) conflicts.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=574,height=342,format=webp/_astro/routing-section-menu.CEq17il_.png&quot; alt=&quot;Screenshot of the routing section menu&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;574&quot; height=&quot;342&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-widgets&quot;&gt;New widgets&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-widgets&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The routing overview now includes a &lt;strong&gt;Top 100 ASes&lt;/strong&gt; table ranking autonomous systems by customer cone size, IPv4 address space, or IPv6 address space. Users can switch between rankings using a segmented control.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1426,format=webp/_astro/top-100-ases-table.ZBSReN_5.png&quot; alt=&quot;Screenshot of the top-100 ASes table&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;1426&quot;&gt;
&lt;p&gt;The RPKI sub-page introduces a &lt;strong&gt;RPKI validation&lt;/strong&gt; view for per-ASN pages, showing prefixes grouped by RPKI validation status (Valid, Invalid, Unknown) with visibility scores.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=978,format=webp/_astro/rpki-validation-view.D3eQih4x.png&quot; alt=&quot;Screenshot of the RPKI validation view&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;978&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;improved-ip-address-space-chart&quot;&gt;Improved IP address space chart&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#improved-ip-address-space-chart&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://radar.cloudflare.com/routing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;IP address space&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; chart now displays both IPv4 and IPv6 trends stacked vertically and is available on global, country, and AS views.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1310,format=webp/_astro/combined-ipv4-ipv6-space.DQ5qc8la.png&quot; alt=&quot;Screenshot of the IPv4 and IPv6 combined IP space chart&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;1310&quot;&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://radar.cloudflare.com/routing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Radar routing section&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to explore the data, and stay tuned for more routing insights coming soon.&lt;/p&gt;</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Rules - New QUIC RTT and delivery rate fields</title><link>https://developers.cloudflare.com/changelog/post/2026-04-01-quic-rtt-delivery-rate-fields/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-01-quic-rtt-delivery-rate-fields/</guid><description>&lt;p&gt;Two new fields are now available in rule expressions that surface Layer 4 transport telemetry from the client connection. Together with the existing &lt;a href=&quot;https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/&quot;&gt;&lt;code&gt;cf.timings.client_tcp_rtt_msec&lt;/code&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Previously, QUIC RTT and delivery rate data was only available via the &lt;code&gt;Server-Timing: cfL4&lt;/code&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-fields&quot;&gt;New fields&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-fields&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.timings.client_quic_rtt_msec&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;The smoothed QUIC round-trip time (RTT) between Cloudflare and the client in milliseconds. Only populated for QUIC (HTTP/3) connections. Returns &lt;code&gt;0&lt;/code&gt; for TCP connections.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.edge.l4.delivery_rate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;The most recent data delivery rate estimate for the client connection, in bytes per second. Returns &lt;code&gt;0&lt;/code&gt; when L4 statistics are not available for the request.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-route-slow-connections-to-a-lightweight-origin&quot;&gt;Example: Route slow connections to a lightweight origin&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-route-slow-connections-to-a-lightweight-origin&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Use a request header transform rule to tag requests from high-latency connections, so your origin can serve a lighter page variant:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rule expression:&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;cf.timings.client_tcp_rtt_msec &amp;gt; 200 or cf.timings.client_quic_rtt_msec &amp;gt; 200&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Header modifications:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Header name&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Set&lt;/td&gt;
&lt;td&gt;&lt;code&gt;X-High-Latency&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-match-low-bandwidth-connections&quot;&gt;Example: Match low-bandwidth connections&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-match-low-bandwidth-connections&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;cf.edge.l4.delivery_rate &amp;gt; 0 and cf.edge.l4.delivery_rate &amp;lt; 100000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/rules/transform/request-header-modification/&quot;&gt;Request Header Transform Rules&lt;/a&gt; and the &lt;a href=&quot;https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/&quot;&gt;fields reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><product>Rules</product><category>Rules</category></item><item><title>Workers - Deploy Hooks are now available for Workers Builds</title><link>https://developers.cloudflare.com/changelog/post/2026-04-01-deploy-hooks/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-01-deploy-hooks/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/&quot;&gt;Workers Builds&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Each Deploy Hook is a unique URL tied to a specific branch. Send it a &lt;code&gt;POST&lt;/code&gt; and your Worker builds and deploys.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/workers/builds/deploy_hooks/&amp;lt;DEPLOY_HOOK_ID&amp;gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To create one, go to &lt;strong&gt;Workers &amp;amp; Pages&lt;/strong&gt; &amp;gt; your Worker &amp;gt; &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Builds&lt;/strong&gt; &amp;gt; &lt;strong&gt;Deploy Hooks&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Since a Deploy Hook is a URL, you can also call it from another Worker. For example, a Worker with a &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/cron-triggers/&quot;&gt;Cron Trigger&lt;/a&gt; can rebuild your project on a schedule:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; scheduled&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		ctx.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;waitUntil&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;DEPLOY_HOOK_URL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { method: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;POST&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; scheduled&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ScheduledEvent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExecutionContext&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    ctx.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;waitUntil&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;DEPLOY_HOOK_URL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { method: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;POST&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExportedHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;You can also use Deploy Hooks to &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/deploy-hooks/#cms-integration&quot;&gt;rebuild when your CMS publishes new content&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/deploy-hooks/#deploy-from-a-slack-slash-command&quot;&gt;deploy from a Slack slash command&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;built-in-optimizations&quot;&gt;Built-in optimizations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#built-in-optimizations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Automatic deduplication&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Last triggered&lt;/strong&gt;: The dashboard shows when each hook was last triggered.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build source&lt;/strong&gt;: Your Worker&apos;s build history shows which Deploy Hook started each build by name.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Deploy Hooks are rate limited to 10 builds per minute per Worker and 100 builds per minute per account. For all limits, see &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/limits-and-pricing/&quot;&gt;Limits &amp;amp; pricing&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To get started, read the &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/deploy-hooks/&quot;&gt;Deploy Hooks documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - New L4 transport telemetry fields in Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-04-01-l4-transport-telemetry-fields/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-04-01-l4-transport-telemetry-fields/</guid><description>&lt;p&gt;Three new properties are now available on &lt;code&gt;request.cf&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;Previously, this telemetry was only available via the &lt;code&gt;Server-Timing: cfL4&lt;/code&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-properties&quot;&gt;New properties&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-properties&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;clientTcpRtt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;number | undefined&lt;/td&gt;
&lt;td&gt;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, &lt;code&gt;22&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;clientQuicRtt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;number | undefined&lt;/td&gt;
&lt;td&gt;The smoothed QUIC round-trip time (RTT) between Cloudflare and the client in milliseconds. Only present for QUIC connections (HTTP/3). For example, &lt;code&gt;42&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;edgeL4&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Object | undefined&lt;/td&gt;
&lt;td&gt;Layer 4 transport statistics. Contains &lt;code&gt;deliveryRate&lt;/code&gt; (number) — the most recent data delivery rate estimate for the connection, in bytes per second. For example, &lt;code&gt;123456&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-log-connection-quality-metrics&quot;&gt;Example: Log connection quality metrics&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-log-connection-quality-metrics&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; cf&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; request.cf;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; rtt&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; cf.clientTcpRtt &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;??&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; cf.clientQuicRtt &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;??&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; deliveryRate&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; cf.edgeL4?.deliveryRate &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;??&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; transport&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; cf.clientTcpRtt &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;TCP&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;QUIC&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Transport: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;transport&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}, RTT: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;rtt&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}ms, Delivery rate: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;deliveryRate&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} B/s`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; headers&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Headers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request.headers);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;X-Client-RTT&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(rtt));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;X-Delivery-Rate&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(deliveryRate));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, { headers }));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/request/&quot;&gt;Workers Runtime APIs: Request&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>DNS - Internal DNS - now in open beta</title><link>https://developers.cloudflare.com/changelog/post/2026-03-31-internal-dns-open-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-31-internal-dns-open-beta/</guid><description>&lt;p&gt;Internal DNS is now in open beta.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;who-can-use-it&quot;&gt;Who can use it?&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#who-can-use-it&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Internal DNS is bundled as a part of Cloudflare Gateway and is now available to every Enterprise customer with one of the following subscriptions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare Zero Trust Enterprise&lt;/li&gt;
&lt;li&gt;Cloudflare Gateway Enterprise&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To learn more and get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/dns/internal-dns/&quot;&gt;Internal DNS documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 31 Mar 2026 00:00:00 GMT</pubDate><product>DNS</product><category>DNS</category></item><item><title>WAF - WAF Release - 2026-03-30</title><link>https://developers.cloudflare.com/changelog/post/2026-03-30-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-30-waf-release/</guid><description>
&lt;p&gt;This week&apos;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;4f7d513cea424c2a853881982f7f95e9&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...2f7f95e9&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Parameter Pollution - Body&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;60d023f3be414d379428add3319731a4&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...319731a4&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;p&gt;&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Generic Rules - Parameter Pollution - Header - Form&lt;/td&gt;
&lt;td&gt;Log&lt;/td&gt;
&lt;td&gt;Disabled&lt;/td&gt;&lt;br&gt;
&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/p&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;2dde02d792ad41ec8fd65c2bdef262dd&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...def262dd&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;p&gt;&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Generic Rules - Parameter Pollution - URI&lt;/td&gt;
&lt;td&gt;Log&lt;/td&gt;
&lt;td&gt;Disabled&lt;/td&gt;&lt;br&gt;
&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/p&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ab8a96ed13034d56a81a79e570a36147&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...70a36147&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Magento 2 - Unrestricted file upload&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;0a13a38dd81c44688950444e2ffcca9f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...2ffcca9f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Fortinet FortiCloud SSO - Authentication Bypass - CVE:CVE-2025-59718&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - New RFC 9440 mTLS certificate fields in Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-03-27-rfc9440-mtls-fields/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-27-rfc9440-mtls-fields/</guid><description>&lt;p&gt;Four new fields are now available on &lt;code&gt;request.cf.tlsClientAuth&lt;/code&gt; in Workers for requests that include a mutual TLS (mTLS) client certificate. These fields encode the client certificate and its intermediate chain in &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9440&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 9440&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; format — the same standard format used by the &lt;code&gt;Client-Cert&lt;/code&gt; and &lt;code&gt;Client-Cert-Chain&lt;/code&gt; HTTP headers — so your Worker can forward them directly to your origin without any custom parsing or encoding logic.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-fields&quot;&gt;New fields&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-fields&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;certRFC9440&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The client leaf certificate in RFC 9440 format (&lt;code&gt;:base64-DER:&lt;/code&gt;). Empty if no client certificate was presented.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;certRFC9440TooLarge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt; if the leaf certificate exceeded 10 KB and was omitted from &lt;code&gt;certRFC9440&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;certChainRFC9440&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;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.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;certChainRFC9440TooLarge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt; if the intermediate chain exceeded 16 KB and was omitted from &lt;code&gt;certChainRFC9440&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-forwarding-client-certificate-headers-to-your-origin&quot;&gt;Example: forwarding client certificate headers to your origin&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-forwarding-client-certificate-headers-to-your-origin&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tls&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; request.cf.tlsClientAuth;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;    // Only forward if cert was verified and chain is complete&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;tls &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; !&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;tls.certVerified &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; tls.certRevoked &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; tls.certChainRFC9440TooLarge) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;      return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Unauthorized&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { status: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;401&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; headers&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Headers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request.headers);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Client-Cert&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, tls.certRFC9440);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Client-Cert-Chain&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, tls.certChainRFC9440);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, { headers }));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/ssl/client-certificates/client-certificate-variables/#workers-variables&quot;&gt;Client certificate variables&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/service-credentials/mutual-tls-authentication/&quot;&gt;Mutual TLS authentication&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 27 Mar 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Access - Code Mode for MCP server portals</title><link>https://developers.cloudflare.com/changelog/post/2026-03-26-mcp-portal-code-mode/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-26-mcp-portal-code-mode/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/&quot;&gt;MCP server portals&lt;/a&gt; support &lt;a href=&quot;https://developers.cloudflare.com/agents/model-context-protocol/codemode/&quot;&gt;Code Mode MCP server patterns&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;To turn it off, edit the portal in &lt;strong&gt;Access controls&lt;/strong&gt; &amp;gt; &lt;strong&gt;AI controls&lt;/strong&gt; and turn off &lt;strong&gt;Code Mode&lt;/strong&gt; under &lt;strong&gt;Basic information&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;When Code Mode is active, the portal exposes a single &lt;code&gt;code&lt;/code&gt; tool instead of listing every tool from every upstream MCP server. The connected AI agent writes JavaScript that calls typed &lt;code&gt;codemode.*&lt;/code&gt; methods for each upstream tool. The generated code runs in an isolated &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/worker-loader/&quot;&gt;Dynamic Worker&lt;/a&gt; environment, keeping authentication credentials and environment variables out of the model context.&lt;/p&gt;
&lt;p&gt;To use Code Mode, append &lt;code&gt;?codemode=search_and_execute&lt;/code&gt; to your portal URL when connecting from an MCP client:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;https://&amp;lt;subdomain&amp;gt;.&amp;lt;domain&amp;gt;/mcp?codemode=search_and_execute&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#code-mode&quot;&gt;Code Mode&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Access - Context optimization for MCP server portals</title><link>https://developers.cloudflare.com/changelog/post/2026-03-26-mcp-portal-context-optimization/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-26-mcp-portal-context-optimization/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/&quot;&gt;MCP server portals&lt;/a&gt; support two context optimization options that reduce how many tokens tool definitions consume in the model&apos;s context window. Both options are activated by appending the &lt;code&gt;optimize_context&lt;/code&gt; query parameter to the portal URL.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;minimize_tools&quot;&gt;&lt;code&gt;minimize_tools&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#minimize_tools&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Strips tool descriptions and input schemas from all upstream tools, leaving only their names. The portal exposes a special &lt;code&gt;query&lt;/code&gt; tool that agents use to retrieve full definitions on demand. This provides up to 5x savings in token usage.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;https://&amp;lt;subdomain&amp;gt;.&amp;lt;domain&amp;gt;/mcp?optimize_context=minimize_tools&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;search_and_execute&quot;&gt;&lt;code&gt;search_and_execute&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#search_and_execute&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Hides all upstream tools and exposes only two tools: &lt;code&gt;query&lt;/code&gt; and &lt;code&gt;execute&lt;/code&gt;. The &lt;code&gt;query&lt;/code&gt; tool searches and retrieves tool definitions. The &lt;code&gt;execute&lt;/code&gt; tool runs the upstream tools in an isolated &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/worker-loader/&quot;&gt;Dynamic Worker&lt;/a&gt; environment. This reduces the initial token cost to a small constant, regardless of how many tools are available through the portal.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;https://&amp;lt;subdomain&amp;gt;.&amp;lt;domain&amp;gt;/mcp?optimize_context=search_and_execute&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#optimize-context&quot;&gt;Optimize context&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Containers - Easily connect Containers and Sandboxes to Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-03-26-outbound-workers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-26-outbound-workers/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt; now support connecting directly to Workers over HTTP. This allows you to call Workers
functions and &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/&quot;&gt;bindings&lt;/a&gt;, like &lt;a href=&quot;https://developers.cloudflare.com/kv&quot;&gt;KV&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt;, from within the container at specific hostnames.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;run-worker-code&quot;&gt;Run Worker code&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#run-worker-code&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Define an &lt;code&gt;outbound&lt;/code&gt; handler to capture any HTTP request or use &lt;code&gt;outboundByHost&lt;/code&gt; to capture requests to individual hostnames and IPs.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyApp&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Sandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;MyApp.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;outbound&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// you can run arbitrary functions defined in your Worker on any HTTP request&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; someWorkersFunction&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request.body);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;MyApp.outboundByHost &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;my.worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; anotherFunction&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request.body);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;In this example, requests from the container to &lt;code&gt;http://my.worker&lt;/code&gt; will run the function defined within &lt;code&gt;outboundByHost&lt;/code&gt;,
and any other HTTP requests will run the &lt;code&gt;outbound&lt;/code&gt; handler. These handlers run entirely inside the Workers runtime,
outside of the container sandbox.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;access-workers-bindings&quot;&gt;Access Workers bindings&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#access-workers-bindings&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Each handler has access to &lt;code&gt;env&lt;/code&gt;, so it can call any binding set in &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/#bindings&quot;&gt;Wrangler config&lt;/a&gt;.
Code inside the container makes a standard HTTP request to that hostname and the outbound Worker translates it into a binding call.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyApp&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Sandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;MyApp.outboundByHost &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;my.kv&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; key&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; URL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request.url).pathname.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; value&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;KV&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(key);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(value &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;??&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { status: value &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 200&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 404&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;my.r2&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; key&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; URL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request.url).pathname.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; object&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;BUCKET&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(key);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(object?.body &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;??&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { status: object &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 200&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 404&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Now, from inside the container sandbox, &lt;code&gt;curl http://my.kv/some-key&lt;/code&gt; will access &lt;a href=&quot;https://developers.cloudflare.com/kv&quot;&gt;Workers KV&lt;/a&gt; and &lt;code&gt;curl http://my.r2/some-object&lt;/code&gt; will access &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;access-durable-object-state&quot;&gt;Access Durable Object state&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#access-durable-object-state&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Use &lt;code&gt;ctx.containerId&lt;/code&gt; to reference the container&apos;s automatically provisioned &lt;a href=&quot;https://developers.cloudflare.com/durable-objects&quot;&gt;Durable Object&lt;/a&gt;.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyContainer&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Container&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;MyContainer.outboundByHost &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;get-state.do&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_CONTAINER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;idFromString&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(ctx.containerId);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stub&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_CONTAINER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(id);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stub.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getStateForKey&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request.body);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;This provides an easy way to associate state with any container instance, and includes a &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/get-started/#2-write-a-durable-object-class-using-sql-api&quot;&gt;built-in SQLite database&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started-today&quot;&gt;Get Started Today&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started-today&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Upgrade to &lt;code&gt;@cloudflare/containers&lt;/code&gt; version 0.2.0 or later, or &lt;code&gt;@cloudflare/sandbox&lt;/code&gt; version 0.8.0 or later to use outbound Workers.&lt;/p&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/outbound-traffic/&quot;&gt;Containers outbound traffic&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/sandbox/guides/outbound-traffic/&quot;&gt;Sandboxes outbound traffic&lt;/a&gt; for more details and examples.&lt;/p&gt;</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Data Loss Prevention - Streaming ZIP file scanning removes per-file size limits</title><link>https://developers.cloudflare.com/changelog/post/2026-03-26-streaming-zip-handler/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-26-streaming-zip-handler/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Microsoft Office documents (DOCX, XLSX, PPTX) also benefit from this improvement, as they use ZIP as a container format.&lt;/p&gt;
&lt;p&gt;This improvement is automatic — no configuration changes are required.&lt;/p&gt;</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate><product>Data Loss Prevention</product><category>Data Loss Prevention</category></item><item><title>Durable Objects, Workers - Access Durable Object jurisdiction via `ctx.id.jurisdiction`</title><link>https://developers.cloudflare.com/changelog/post/2026-03-26-durable-object-id-jurisdiction/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-26-durable-object-id-jurisdiction/</guid><description>&lt;p&gt;&lt;code&gt;ctx.id.jurisdiction&lt;/code&gt; inside a Durable Object now reports the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/reference/data-location/#restrict-durable-objects-to-a-jurisdiction&quot;&gt;jurisdiction&lt;/a&gt; the object was created in — for example &lt;code&gt;&quot;eu&quot;&lt;/code&gt; when accessed through &lt;code&gt;env.MY_DURABLE_OBJECT.jurisdiction(&quot;eu&quot;)&lt;/code&gt; — 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 &lt;code&gt;jurisdiction&lt;/code&gt;, refer to the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/id/#jurisdiction&quot;&gt;Durable Object ID documentation&lt;/a&gt;.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; RegionalRoom&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DurableObject&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// &quot;eu&quot; when accessed through env.MY_DURABLE_OBJECT.jurisdiction(&quot;eu&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; region&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.id.jurisdiction;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Hello from ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;region&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; ??&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;the default region&quot;}!`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Worker&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stub&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_DURABLE_OBJECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;jurisdiction&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;eu&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getByName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;general&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stub.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;code&gt;ctx.id.jurisdiction&lt;/code&gt; is &lt;code&gt;undefined&lt;/code&gt; for Durable Objects that were not created in a jurisdiction-restricted namespace. Alarms scheduled before 2026-03-15 also do not have &lt;code&gt;jurisdiction&lt;/code&gt; stored; to backfill the value, reschedule the alarm from a &lt;code&gt;fetch()&lt;/code&gt; or RPC handler.&lt;/p&gt;</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Radar - URL Scanner improvements on Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-03-26-url-scanner-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-26-url-scanner-improvements/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; ships several improvements to the &lt;a href=&quot;https://radar.cloudflare.com/scan&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;URL Scanner&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; that make scan reports more informative and easier to share:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Live screenshots&lt;/strong&gt; — the summary card now includes an option to capture a live screenshot of the scanned URL on demand using the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/&quot;&gt;Browser Rendering&lt;/a&gt; API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Save as PDF&lt;/strong&gt; — a new button generates a print-optimized document aggregating all tab contents (Summary, Security, Network, Behavior, and Indicators) into a single file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Download as JSON&lt;/strong&gt; — raw scan data is available as a JSON download for programmatic use.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Redesigned summary layout&lt;/strong&gt; — page information and security details are now displayed side by side with the screenshot, with a layout that adapts to narrower viewports.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File downloads&lt;/strong&gt; — downloads are separated into a dedicated card with expandable rows showing each file&apos;s source URL and SHA256 hash.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Detailed IP address data&lt;/strong&gt; — the Network tab now includes additional detail per IP address observed during the scan.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2424,height=2658,format=webp/_astro/url-scanner-summary-redesign.DO4wDjQ3.png&quot; alt=&quot;Screenshot of the redesigned URL Scanner summary on Radar&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2424&quot; height=&quot;2658&quot;&gt;
&lt;p&gt;Explore these improvements on the &lt;a href=&quot;https://radar.cloudflare.com/scan&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Radar URL Scanner&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 26 Mar 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Data Loss Prevention - Detect and sanitize HAR files</title><link>https://developers.cloudflare.com/changelog/post/2026-03-25-har-file-detection-and-sanitization/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-25-har-file-detection-and-sanitization/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Gateway now includes a predefined DLP profile called &lt;strong&gt;Unsanitized HAR&lt;/strong&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;how-to-configure-a-har-file-policy&quot;&gt;How to configure a HAR file policy&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#how-to-configure-a-har-file-policy&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In the &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, go to  &lt;strong&gt;Zero Trust&lt;/strong&gt; &amp;gt;  &lt;strong&gt;Traffic policies&lt;/strong&gt; &amp;gt; &lt;strong&gt;Firewall Policies&lt;/strong&gt; &amp;gt; &lt;strong&gt;HTTP&lt;/strong&gt; and create a new HTTP policy using the &lt;strong&gt;DLP Profile&lt;/strong&gt; selector:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Selector&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DLP Profile&lt;/td&gt;
&lt;td&gt;in&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Unsanitized HAR&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Then choose one of the following actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Block&lt;/strong&gt;: Prevents the upload of any HAR file that has not been sanitized by Cloudflare&apos;s sanitizer. Use this for strict environments where HAR file sharing must be disallowed entirely.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Block&lt;/strong&gt; with &lt;strong&gt;Gateway Redirect&lt;/strong&gt;: Intercepts the upload and redirects the user to &lt;code&gt;https://har-sanitizer.pages.dev/&lt;/code&gt;, where they can sanitize the file. Once sanitized, the user can re-upload the clean file and proceed with their workflow.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;sanitized-har-recognition&quot;&gt;Sanitized HAR recognition&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#sanitized-har-recognition&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;visibility-in-gateway-logs&quot;&gt;Visibility in Gateway logs&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#visibility-in-gateway-logs&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Gateway logs will reflect whether a detected HAR file was classified as &lt;strong&gt;Unsanitized&lt;/strong&gt; or &lt;strong&gt;Sanitized&lt;/strong&gt;, giving your security team full visibility into HAR file activity across your organization.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/predefined-profiles/&quot;&gt;predefined DLP profiles&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><product>Data Loss Prevention</product><category>Data Loss Prevention</category></item><item><title>logpush, Logs - Logpush — More granular timestamps</title><link>https://developers.cloudflare.com/changelog/post/2026-03-25-logpush-granular-timestamps/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-25-logpush-granular-timestamps/</guid><description>&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/api/resources/logpush/subresources/jobs/&quot;&gt;Logpush API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To use the new formats, set &lt;code&gt;timestamp_format&lt;/code&gt; in your Logpush job&apos;s &lt;code&gt;output_options&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rfc3339ms&lt;/code&gt; — &lt;code&gt;2024-02-17T23:52:01.123Z&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rfc3339ns&lt;/code&gt; — &lt;code&gt;2024-02-17T23:52:01.123456789Z&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Default timestamp formats apply unless explicitly set. The dashboard defaults to &lt;code&gt;rfc3339&lt;/code&gt; and the API defaults to &lt;code&gt;unixnano&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/log-output-options/&quot;&gt;Log output options&lt;/a&gt; documentation.&lt;/p&gt;</description><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><product>logpush</product><category>logpush</category><category>Logs</category></item><item><title>Rules - New mTLS certificate fields for Transform Rules</title><link>https://developers.cloudflare.com/changelog/post/2026-03-25-rfc9440-mtls-fields/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-25-rfc9440-mtls-fields/</guid><description>&lt;p&gt;Cloudflare now exposes four new fields in the Transform Rules phase that encode client certificate data in &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9440&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 9440&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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 &lt;code&gt;Client-Cert&lt;/code&gt; and &lt;code&gt;Client-Cert-Chain&lt;/code&gt; header format defined by RFC 9440, so your origin can consume them directly without any additional decoding logic.&lt;/p&gt;
&lt;p&gt;Each certificate is DER-encoded, Base64-encoded, and wrapped in colons. For example, &lt;code&gt;:MIIDsT...Vw==:&lt;/code&gt;. A chain of intermediates is expressed as a comma-separated list of such values.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-fields&quot;&gt;New fields&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-fields&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.tls_client_auth.cert_rfc9440&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;The client leaf certificate in RFC 9440 format. Empty if no client certificate was presented.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.tls_client_auth.cert_rfc9440_too_large&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt; if the leaf certificate exceeded 10 KB and was omitted. In practice this will almost always be &lt;code&gt;false&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.tls_client_auth.cert_chain_rfc9440&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;td&gt;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.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.tls_client_auth.cert_chain_rfc9440_too_large&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt; if the intermediate chain exceeded 16 KB and was omitted.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-forwarding-client-certificate-headers-to-your-origin-server&quot;&gt;Example: Forwarding client certificate headers to your origin server&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-forwarding-client-certificate-headers-to-your-origin-server&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Add a request header transform rule to set the &lt;code&gt;Client-Cert&lt;/code&gt; and &lt;code&gt;Client-Cert-Chain&lt;/code&gt; headers on requests forwarded to your origin server. For example, to forward headers for verified, non-revoked certificates:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rule expression:&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;cf.tls_client_auth.cert_verified and not cf.tls_client_auth.cert_revoked&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Header modifications:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Header name&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Set&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Client-Cert&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cf.tls_client_auth.cert_rfc9440&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Set&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Client-Cert-Chain&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cf.tls_client_auth.cert_chain_rfc9440&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;code&gt;cf.tls_client_auth.cert_verified&lt;/code&gt; and &lt;code&gt;cf.tls_client_auth.cert_revoked&lt;/code&gt;.&lt;/p&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Prevent header injection&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-warning); --_t: var(--nb-warning-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:warning&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Prevent header injection&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;You should ensure that &lt;code&gt;Client-Cert&lt;/code&gt; and &lt;code&gt;Client-Cert-Chain&lt;/code&gt; headers received by your origin server can only originate from this transform rule — any client could send these headers directly.&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If you use WAF custom rules to block requests with invalid mTLS connections:&lt;/strong&gt; The transform rule is sufficient. For all requests that reach your origin server, the rule will overwrite any existing &lt;code&gt;Client-Cert&lt;/code&gt; and &lt;code&gt;Client-Cert-Chain&lt;/code&gt; headers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you do not enforce mTLS at the WAF:&lt;/strong&gt; Add another transform rule that removes any incoming &lt;code&gt;Client-Cert&lt;/code&gt; and &lt;code&gt;Client-Cert-Chain&lt;/code&gt; headers from all requests (use expression &lt;code&gt;true&lt;/code&gt;), ordered before the rule above. This ensures your origin server cannot receive client-supplied values for these HTTP headers.&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/service-credentials/mutual-tls-authentication/&quot;&gt;Mutual TLS authentication&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/rules/transform/request-header-modification/&quot;&gt;Request Header Transform Rules&lt;/a&gt;, and the &lt;a href=&quot;https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/&quot;&gt;fields reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><product>Rules</product><category>Rules</category></item><item><title>Workers - Declare required secrets in your Wrangler configuration</title><link>https://developers.cloudflare.com/changelog/post/2026-03-24-secrets-config-property/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-24-secrets-config-property/</guid><description>
&lt;p&gt;The new &lt;code&gt;secrets&lt;/code&gt; 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.&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;secrets&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;required&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;API_KEY&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;DB_PASSWORD&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;secrets&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;required = [ &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;API_KEY&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;DB_PASSWORD&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;local-development&quot;&gt;Local development&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#local-development&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When &lt;code&gt;secrets&lt;/code&gt; is defined, &lt;code&gt;wrangler dev&lt;/code&gt; and &lt;code&gt;vite dev&lt;/code&gt; load only the keys listed in &lt;code&gt;secrets.required&lt;/code&gt; from &lt;code&gt;.dev.vars&lt;/code&gt; or &lt;code&gt;.env&lt;/code&gt;/&lt;code&gt;process.env&lt;/code&gt;. Additional keys in those files are excluded. If any required secrets are missing, a warning is logged listing the missing names.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;type-generation&quot;&gt;Type generation&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#type-generation&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;wrangler types&lt;/code&gt; generates typed bindings from &lt;code&gt;secrets.required&lt;/code&gt; instead of inferring names from &lt;code&gt;.dev.vars&lt;/code&gt; or &lt;code&gt;.env&lt;/code&gt;. This lets you run type generation in CI or other environments where those files are not present. Per-environment secrets are supported — the aggregated &lt;code&gt;Env&lt;/code&gt; type marks secrets that only appear in some environments as optional.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;deploy&quot;&gt;Deploy&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#deploy&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;wrangler deploy&lt;/code&gt; and &lt;code&gt;wrangler versions upload&lt;/code&gt; validate that all secrets in &lt;code&gt;secrets.required&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/#secrets-configuration-property&quot;&gt;&lt;code&gt;secrets&lt;/code&gt; configuration property&lt;/a&gt; reference.&lt;/p&gt;</description><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Crawl Control - Advanced WAF customization for AI Crawl Control blocks</title><link>https://developers.cloudflare.com/changelog/post/2026-03-24-waf-rule-preservation/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-24-waf-rule-preservation/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;If the WAF rule expression has been modified in a way AI Crawl Control cannot parse, a warning banner appears on the &lt;strong&gt;Crawlers&lt;/strong&gt; page with a link to view the rule directly in WAF.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/features/manage-ai-crawlers/#waf-rule-management&quot;&gt;WAF rule management&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><product>AI Crawl Control</product><category>AI Crawl Control</category></item><item><title>Cache - Cache Response Rules</title><link>https://developers.cloudflare.com/changelog/post/2026-03-24-cache-response-rules/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-24-cache-response-rules/</guid><description>&lt;p&gt;You can now control how Cloudflare handles origin responses without changing your origin. Cache Response Rules let you modify &lt;code&gt;Cache-Control&lt;/code&gt; directives, manage cache tags, and strip headers like &lt;code&gt;Set-Cookie&lt;/code&gt; from origin responses &lt;em&gt;before&lt;/em&gt; they reach Cloudflare&apos;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-changed&quot;&gt;What changed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Modify &lt;code&gt;Cache-Control&lt;/code&gt; directives&lt;/strong&gt;: Set or remove individual directives like &lt;code&gt;no-store&lt;/code&gt;, &lt;code&gt;no-cache&lt;/code&gt;, &lt;code&gt;max-age&lt;/code&gt;, &lt;code&gt;s-maxage&lt;/code&gt;, &lt;code&gt;stale-while-revalidate&lt;/code&gt;, &lt;code&gt;immutable&lt;/code&gt;, and more. For example, remove a &lt;code&gt;no-cache&lt;/code&gt; directive your origin sends so Cloudflare can cache the asset, or set an &lt;code&gt;s-maxage&lt;/code&gt; to control how long Cloudflare stores it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Set a different browser &lt;code&gt;Cache-Control&lt;/code&gt;&lt;/strong&gt;: Send a different &lt;code&gt;Cache-Control&lt;/code&gt; header downstream to browsers and other clients than what Cloudflare uses internally, giving you independent control over edge and browser caching strategies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manage cache tags&lt;/strong&gt;: Add, set, or remove cache tags on responses, including converting tags from another CDN&apos;s header format into Cloudflare&apos;s &lt;code&gt;Cache-Tag&lt;/code&gt; header. This is especially useful if you are migrating from a CDN that uses a different tag header or delimiter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Strip headers that block caching&lt;/strong&gt;: Remove &lt;code&gt;Set-Cookie&lt;/code&gt;, &lt;code&gt;ETag&lt;/code&gt;, or &lt;code&gt;Last-Modified&lt;/code&gt; headers from origin responses before caching, so responses that would otherwise be treated as uncacheable can be stored and served from cache.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;benefits&quot;&gt;Benefits&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#benefits&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No origin changes required&lt;/strong&gt;: Fix caching behavior entirely from Cloudflare, even when your origin configuration is locked down or managed by a different team.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simpler CDN migration&lt;/strong&gt;: Match caching behavior from other CDN providers without rewriting your origin. Translate cache tag formats and override directives that do not align with Cloudflare&apos;s defaults.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Native support, fewer workarounds&lt;/strong&gt;: Functionality that previously required workarounds is now built into Cache Rules with full Tiered Cache compatibility.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fine-grained control&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Configure Cache Response Rules in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/:zone/caching/cache-rules&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; under &lt;strong&gt;Caching&lt;/strong&gt; &amp;gt; &lt;strong&gt;Cache Rules&lt;/strong&gt;, or via the &lt;a href=&quot;https://developers.cloudflare.com/ruleset-engine/rulesets-api/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Rulesets API&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/cache/how-to/cache-response-rules/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cache Rules documentation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><product>Cache</product><category>Cache</category></item><item><title>Containers - Use Docker Hub images with Containers</title><link>https://developers.cloudflare.com/changelog/post/2026-03-24-docker-hub-images/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-24-docker-hub-images/</guid><description>
&lt;p&gt;Containers now support &lt;a href=&quot;https://hub.docker.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Docker Hub&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; images. You can use a fully qualified Docker Hub image reference in your &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/#containers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Wrangler configuration&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; instead of first pushing the image to Cloudflare Registry.&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;containers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;			// Example: docker.io/cloudflare/sandbox:0.7.18&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;image&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;docker.io/&amp;#x3C;NAMESPACE&gt;/&amp;#x3C;REPOSITORY&gt;:&amp;#x3C;TAG&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;image = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;docker.io/&amp;#x3C;NAMESPACE&gt;/&amp;#x3C;REPOSITORY&gt;:&amp;#x3C;TAG&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;Containers also support private Docker Hub images. To configure credentials, refer to &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/image-management/#use-private-docker-hub-images&quot;&gt;Use private Docker Hub images&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/image-management/&quot;&gt;Image management&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Gateway - OIDC Claims filtering now available in Gateway Firewall, Resolver, and Egress policies</title><link>https://developers.cloudflare.com/changelog/post/2026-03-24-oidc-claims-filtering-gateway-policies/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-24-oidc-claims-filtering-gateway-policies/</guid><description>&lt;p&gt;Cloudflare Gateway now supports &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/identity-selectors/#oidc-claims&quot;&gt;OIDC Claims&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;With this update, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Filter traffic in &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/dns-policies/&quot;&gt;DNS&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/&quot;&gt;HTTP&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/&quot;&gt;Network&lt;/a&gt; firewall policies based on OIDC claim values.&lt;/li&gt;
&lt;li&gt;Apply custom &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/resolver-policies/&quot;&gt;resolver policies&lt;/a&gt; to route DNS queries to specific resolvers depending on a user&apos;s OIDC claims.&lt;/li&gt;
&lt;li&gt;Control &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/egress-policies/&quot;&gt;egress policies&lt;/a&gt; to assign dedicated egress IPs based on OIDC claim attributes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For example, you can create a policy that routes traffic differently for users with &lt;code&gt;department=engineering&lt;/code&gt; in their OIDC claims, or restrict access to certain destinations based on a user&apos;s role claim.&lt;/p&gt;
&lt;p&gt;To get started, configure &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/generic-oidc/#custom-oidc-claims&quot;&gt;custom OIDC claims&lt;/a&gt; on your identity provider and use the &lt;strong&gt;OIDC Claims&lt;/strong&gt; selector in the Gateway policy builder.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/identity-selectors/&quot;&gt;Identity-based policies&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category></item><item><title>Network Interconnect - Interconnects moved to Connectors</title><link>https://developers.cloudflare.com/changelog/post/2026-03-24-interconnects-navigation-update/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-24-interconnects-navigation-update/</guid><description>&lt;p&gt;The top-level &lt;strong&gt;Interconnects&lt;/strong&gt; page in the Cloudflare dashboard has been removed. Interconnects are now located under &lt;strong&gt;Connectors&lt;/strong&gt; &amp;gt; &lt;strong&gt;Interconnects&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Your existing configurations and functionality remain the same.&lt;/p&gt;</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><product>Network Interconnect</product><category>Network Interconnect</category></item><item><title>Workers - Dynamic Workers, now in open beta</title><link>https://developers.cloudflare.com/changelog/post/2026-03-24-dynamic-workers-open-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-24-dynamic-workers-open-beta/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/dynamic-workers/&quot;&gt;Dynamic Workers&lt;/a&gt; are now in &lt;a href=&quot;https://blog.cloudflare.com/dynamic-workers/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;open beta&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;use-dynamic-workers-for&quot;&gt;Use Dynamic Workers for&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#use-dynamic-workers-for&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/agents/tools/codemode/&quot;&gt;Code Mode&lt;/a&gt;&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI agents executing code&lt;/strong&gt;: Run code for tasks like data analysis, file transformation, API calls, and chained actions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Running AI-generated code&lt;/strong&gt;: Run generated code for prototypes, projects, and automations in a secure, isolated sandboxed environment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fast development and previews&lt;/strong&gt;: Load prototypes, previews, and playgrounds in milliseconds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom automations&lt;/strong&gt;: Create custom tools on the fly that execute a task, call an integration, or automate a workflow.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;executing-dynamic-workers&quot;&gt;Executing Dynamic Workers&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#executing-dynamic-workers&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Dynamic Workers support two loading modes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;load(code)&lt;/code&gt; — for one-time code execution (equivalent to calling &lt;code&gt;get()&lt;/code&gt; with a null ID).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get(id, callback)&lt;/code&gt; — caches a Dynamic Worker by ID so it can stay warm across requests. Use this when the same code will receive subsequent requests.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; worker&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			compatibilityDate: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-01-01&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			mainModule: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;src/index.js&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			modules: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				&quot;src/index.js&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;					export default {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;						fetch() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;							return new Response(&quot;Hello from a dynamic Worker&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;						},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;					};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;			// Block all outbound network access from the Dynamic Worker.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			globalOutbound: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; worker.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; worker&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			compatibilityDate: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-01-01&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			mainModule: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;src/index.js&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			modules: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				&quot;src/index.js&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;					export default {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;						fetch() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;							return new Response(&quot;Hello from a dynamic Worker&quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;						},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;					};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;				`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;			// Block all outbound network access from the Dynamic Worker.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			globalOutbound: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; worker.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;helper-libraries-for-dynamic-workers&quot;&gt;Helper libraries for Dynamic Workers&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#helper-libraries-for-dynamic-workers&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Here are 3 new libraries to help you build with Dynamic Workers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/codemode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@cloudflare/codemode&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;: Replace individual tool calls with a single &lt;code&gt;code()&lt;/code&gt; tool, so LLMs write and execute TypeScript that orchestrates multiple API calls in one pass.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/worker-bundler&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@cloudflare/worker-bundler&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;: Resolve npm dependencies and bundle source files into ready-to-load modules for Dynamic Workers, all at runtime.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/shell&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@cloudflare/shell&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;: Give your agent a virtual filesystem inside a Dynamic Worker with persistent storage backed by SQLite and R2.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;try-it-out&quot;&gt;Try it out&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#try-it-out&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Dynamic Workers Starter&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/agents/tree/main/examples/dynamic-workers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;img src=&quot;https://deploy.workers.cloudflare.com/button&quot; alt=&quot;Deploy to Workers&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Use this &lt;a href=&quot;https://github.com/cloudflare/agents/tree/main/examples/dynamic-workers&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;starter&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to deploy a Worker that can load and execute Dynamic Workers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dynamic Workers Playground&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/agents/tree/main/examples/dynamic-workers-playground&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;img src=&quot;https://deploy.workers.cloudflare.com/button&quot; alt=&quot;Deploy to Workers&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Deploy the &lt;a href=&quot;https://github.com/cloudflare/agents/tree/main/examples/dynamic-workers-playground&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Dynamic Workers Playground&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to write or import code, bundle it at runtime with &lt;code&gt;@cloudflare/worker-bundler&lt;/code&gt;, execute it through a Dynamic Worker, and see real-time responses and execution logs.&lt;/p&gt;
&lt;p&gt;For the full API reference and configuration options, refer to the &lt;a href=&quot;https://developers.cloudflare.com/dynamic-workers/&quot;&gt;Dynamic Workers documentation&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;pricing&quot;&gt;Pricing&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#pricing&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Dynamic Workers &lt;a href=&quot;https://developers.cloudflare.com/dynamic-workers/pricing/&quot;&gt;pricing&lt;/a&gt; is based on three dimensions: Dynamic Workers created daily, requests, and CPU time.&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Included&lt;/th&gt;
&lt;th&gt;Additional usage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dynamic Workers created daily&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,000 unique Dynamic Workers per month&lt;/td&gt;
&lt;td&gt;+$0.002 per Dynamic Worker per day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Requests&lt;/strong&gt; ¹&lt;/td&gt;
&lt;td&gt;10 million per month&lt;/td&gt;
&lt;td&gt;+$0.30 per million requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPU time&lt;/strong&gt; ¹&lt;/td&gt;
&lt;td&gt;30 million CPU milliseconds per month&lt;/td&gt;
&lt;td&gt;+$0.02 per million CPU milliseconds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;¹ Uses &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/pricing/#workers&quot;&gt;Workers Standard rates&lt;/a&gt; and will appear as part of your existing Workers bill, not as separate Dynamic Workers charges.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</description><pubDate>Tue, 24 Mar 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workflows, Workers - Workflow instances now support pause(), resume(), restart(), and terminate() methods in local development</title><link>https://developers.cloudflare.com/changelog/post/2026-03-23-local-dev-instance-methods/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-23-local-dev-instance-methods/</guid><description>&lt;p&gt;Workflow instance methods &lt;code&gt;pause()&lt;/code&gt;, &lt;code&gt;resume()&lt;/code&gt;, &lt;code&gt;restart()&lt;/code&gt;, and &lt;code&gt;terminate()&lt;/code&gt; are now available in local development when using &lt;code&gt;wrangler dev&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can now test the full Workflow instance lifecycle locally:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; instance&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_WORKFLOW&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	id: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-instance-id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;pause&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// pauses a running workflow instance&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resume&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// resumes a paused instance&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;restart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// restarts the instance from the beginning&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; instance.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;terminate&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// terminates the instance immediately&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><pubDate>Mon, 23 Mar 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Agents, Workers - Agents SDK v0.8.0: readable state, idempotent schedules, typed AgentClient, and Zod 4</title><link>https://developers.cloudflare.com/changelog/post/2026-03-23-agents-sdk-v0.8.0/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-23-agents-sdk-v0.8.0/</guid><description>
&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; exposes agent state as a readable property, prevents duplicate schedule rows across Durable Object restarts, brings full TypeScript inference to &lt;code&gt;AgentClient&lt;/code&gt;, and migrates to Zod 4.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;readable-state-on-useagent-and-agentclient&quot;&gt;Readable &lt;code&gt;state&lt;/code&gt; on &lt;code&gt;useAgent&lt;/code&gt; and &lt;code&gt;AgentClient&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#readable-state-on-useagent-and-agentclient&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Both &lt;code&gt;useAgent&lt;/code&gt; (React) and &lt;code&gt;AgentClient&lt;/code&gt; (vanilla JS) now expose a &lt;code&gt;state&lt;/code&gt; property that reflects the current agent state. Previously, reading state required manually tracking it through the &lt;code&gt;onStateUpdate&lt;/code&gt; callback.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;React (&lt;code&gt;useAgent&lt;/code&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;game-agent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;room-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Read state directly — no separate useState + onStateUpdate needed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-17hn0y&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt;Score: {agent.state?.score}&amp;#x3C;/&lt;/span&gt;&lt;span class=&quot;nb-shiki-17hn0y&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Spread for partial updates&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;agent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;setState&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;agent.state, score: (agent.state?.score &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;??&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;tsx&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;tsx&quot; data-nb-lang=&quot;tsx&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;GameAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;GameState&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;game-agent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;room-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Read state directly — no separate useState + onStateUpdate needed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-17hn0y&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;Score: {agent.state?.score}&amp;lt;/&lt;/span&gt;&lt;span class=&quot;nb-shiki-17hn0y&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Spread for partial updates&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;agent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;setState&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;agent.state, score: (agent.state?.score &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;??&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;agent.state&lt;/code&gt; is reactive — the component re-renders when state changes from either the server or a client-side &lt;code&gt;setState()&lt;/code&gt; call.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vanilla JS (&lt;code&gt;AgentClient&lt;/code&gt;)&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; client&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentClient&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;game-agent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;room-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	host: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;your-worker.workers.dev&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;client.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;setState&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ score: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(client.state); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// { score: 100 }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; client&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentClient&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;GameAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;game-agent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;room-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	host: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;your-worker.workers.dev&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;client.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;setState&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ score: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(client.state); &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// { score: 100 }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;State starts as &lt;code&gt;undefined&lt;/code&gt; and is populated when the server sends the initial state on connect (from &lt;code&gt;initialState&lt;/code&gt;) or when &lt;code&gt;setState()&lt;/code&gt; is called. Use optional chaining (&lt;code&gt;agent.state?.field&lt;/code&gt;) for safe access. The &lt;code&gt;onStateUpdate&lt;/code&gt; callback continues to work as before — the new &lt;code&gt;state&lt;/code&gt; property is additive.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;idempotent-schedule&quot;&gt;Idempotent &lt;code&gt;schedule()&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#idempotent-schedule&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;schedule()&lt;/code&gt; now supports an &lt;code&gt;idempotent&lt;/code&gt; option that deduplicates by &lt;code&gt;(type, callback, payload)&lt;/code&gt;, preventing duplicate rows from accumulating when called in places that run on every Durable Object restart such as &lt;code&gt;onStart()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cron schedules are idempotent by default.&lt;/strong&gt; Calling &lt;code&gt;schedule(&quot;0 * * * *&quot;, &quot;tick&quot;)&lt;/code&gt; multiple times with the same callback, expression, and payload returns the existing schedule row instead of creating a new one. Pass &lt;code&gt;{ idempotent: false }&lt;/code&gt; to override.&lt;/p&gt;
&lt;p&gt;Delayed and date-scheduled types support opt-in idempotency:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Agent } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onStart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Safe across restarts — only one row is created&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;schedule&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;maintenance&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { idempotent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Agent } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onStart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Safe across restarts — only one row is created&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;schedule&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;maintenance&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { idempotent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Two new warnings help catch common foot-guns:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Calling &lt;code&gt;schedule()&lt;/code&gt; inside &lt;code&gt;onStart()&lt;/code&gt; without &lt;code&gt;{ idempotent: true }&lt;/code&gt; emits a &lt;code&gt;console.warn&lt;/code&gt; with actionable guidance (once per callback; skipped for cron and when &lt;code&gt;idempotent&lt;/code&gt; is set explicitly).&lt;/li&gt;
&lt;li&gt;If an alarm cycle processes 10 or more stale one-shot rows for the same callback, the SDK emits a &lt;code&gt;console.warn&lt;/code&gt; and a &lt;code&gt;schedule:duplicate_warning&lt;/code&gt; diagnostics channel event.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;typed-agentclient-with-call-inference-and-stub-proxy&quot;&gt;Typed &lt;code&gt;AgentClient&lt;/code&gt; with &lt;code&gt;call&lt;/code&gt; inference and &lt;code&gt;stub&lt;/code&gt; proxy&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#typed-agentclient-with-call-inference-and-stub-proxy&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;AgentClient&lt;/code&gt; now accepts an optional agent type parameter for full type inference on RPC calls, matching the typed experience already available with &lt;code&gt;useAgent&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; client&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentClient&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-agent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	host: window.location.host,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Typed call — method name autocompletes, args and return type inferred&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; value&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; client.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;getValue&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Typed stub — direct RPC-style proxy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; client.stub.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; client.stub.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; client&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentClient&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-agent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	host: window.location.host,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Typed call — method name autocompletes, args and return type inferred&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; value&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; client.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;getValue&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Typed stub — direct RPC-style proxy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; client.stub.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getValue&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; client.stub.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;State is automatically inferred from the agent type, so &lt;code&gt;onStateUpdate&lt;/code&gt; is also typed:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; client&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentClient&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-agent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	host: window.location.host,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onStateUpdate&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// state is typed as MyAgent&apos;s state type&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; client&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentClient&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-agent&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	host: window.location.host,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onStateUpdate&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// state is typed as MyAgent&apos;s state type&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Existing untyped usage continues to work without changes. The RPC type utilities (&lt;code&gt;AgentMethods&lt;/code&gt;, &lt;code&gt;AgentStub&lt;/code&gt;, &lt;code&gt;RPCMethods&lt;/code&gt;) are now exported from &lt;code&gt;agents/client&lt;/code&gt; for advanced typing scenarios.
&lt;code&gt;agents&lt;/code&gt;, &lt;code&gt;@cloudflare/ai-chat&lt;/code&gt;, and &lt;code&gt;@cloudflare/codemode&lt;/code&gt; now require &lt;code&gt;zod ^4.0.0&lt;/code&gt;. Zod v3 is no longer supported.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cloudflareai-chat-fixes&quot;&gt;&lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cloudflareai-chat-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Turn serialization&lt;/strong&gt; — &lt;code&gt;onChatMessage()&lt;/code&gt; and &lt;code&gt;_reply()&lt;/code&gt; work is now queued so user requests, tool continuations, and &lt;code&gt;saveMessages()&lt;/code&gt; never stream concurrently.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duplicate messages on stop&lt;/strong&gt; — Clicking stop during an active stream no longer splits the assistant message into two entries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duplicate messages after tool calls&lt;/strong&gt; — Orphaned client IDs no longer leak into persistent storage.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;keepalive-and-keepalivewhile-are-no-longer-experimental&quot;&gt;&lt;code&gt;keepAlive()&lt;/code&gt; and &lt;code&gt;keepAliveWhile()&lt;/code&gt; are no longer experimental&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#keepalive-and-keepalivewhile-are-no-longer-experimental&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;keepAlive()&lt;/code&gt; now uses a lightweight in-memory ref count instead of schedule rows. Multiple concurrent callers share a single alarm cycle. The &lt;code&gt;@experimental&lt;/code&gt; tag has been removed from both &lt;code&gt;keepAlive()&lt;/code&gt; and &lt;code&gt;keepAliveWhile()&lt;/code&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cloudflarecodemode-tanstack-ai-integration&quot;&gt;&lt;code&gt;@cloudflare/codemode&lt;/code&gt;: TanStack AI integration&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cloudflarecodemode-tanstack-ai-integration&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A new entry point &lt;code&gt;@cloudflare/codemode/tanstack-ai&lt;/code&gt; adds support for &lt;a href=&quot;https://tanstack.com/ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TanStack AI&apos;s&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; &lt;code&gt;chat()&lt;/code&gt; as an alternative to the Vercel AI SDK&apos;s &lt;code&gt;streamText()&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	createCodeTool,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	tanstackTools,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/codemode/tanstack-ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { chat } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@tanstack/ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; codeTool&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createCodeTool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	tools: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;tanstackTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(myServerTools)],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	executor,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; chat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ adapter, tools: [codeTool], messages });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createCodeTool, tanstackTools } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/codemode/tanstack-ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { chat } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@tanstack/ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; codeTool&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createCodeTool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	tools: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;tanstackTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(myServerTools)],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	executor,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; chat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ adapter, tools: [codeTool], messages });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; agents@latest&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/ai-chat@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>AI Search - New AI Search REST API endpoints for /search and /chat/completions</title><link>https://developers.cloudflare.com/changelog/post/2026-03-23-ai-search-new-rest-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-23-ai-search-new-rest-api/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now offers new &lt;a href=&quot;https://developers.cloudflare.com/ai-search/api/search/rest-api/&quot;&gt;REST API&lt;/a&gt; endpoints for search and chat that use an OpenAI compatible format. This means you can use the familiar &lt;code&gt;messages&lt;/code&gt; 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.&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chat Completions&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /accounts/{account_id}/ai-search/instances/{name}/chat/completions&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /accounts/{account_id}/ai-search/instances/{name}/search&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Here is an example request to the Chat Completions endpoint using the new &lt;code&gt;messages&lt;/code&gt; array format:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai-search/instances/{NAME}/chat/completions&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer {API_TOKEN}&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;messages&quot;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;role&quot;: &quot;system&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;content&quot;: &quot;You are a helpful documentation assistant.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;role&quot;: &quot;user&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;content&quot;: &quot;How do I get started?&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/api/search/rest-api/&quot;&gt;AI Search REST API guide&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;migration-from-existing-autorag-api-recommended&quot;&gt;Migration from existing AutoRAG API (recommended)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#migration-from-existing-autorag-api-recommended&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If you are using the previous AutoRAG API endpoints (&lt;code&gt;/autorag/rags/&lt;/code&gt;), we recommend migrating to the new endpoints. The previous AutoRAG API endpoints will continue to be fully supported.&lt;/p&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/api/migration/rest-api/&quot;&gt;migration guide&lt;/a&gt; for step-by-step instructions.&lt;/p&gt;</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>AI Search - AI Search UI snippets and MCP support</title><link>https://developers.cloudflare.com/changelog/post/2026-03-23-ai-search-public-endpoint-and-snippets/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-23-ai-search-public-endpoint-and-snippets/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now supports public endpoints, UI snippets, and MCP, making it easy to add search to your website or connect AI agents.&lt;/p&gt;
&lt;p&gt;Public endpoints allow you to expose AI Search capabilities without requiring API authentication. To enable public endpoints:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Go to &lt;strong&gt;AI Search&lt;/strong&gt; in the Cloudflare dashboard.
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/ai/ai-search&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;AI Search&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Select your instance, and turn on &lt;strong&gt;Public Endpoint&lt;/strong&gt; in &lt;strong&gt;Settings&lt;/strong&gt;.
For more details, refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/retrieval/public-endpoint/&quot;&gt;Public endpoint configuration&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ui-snippets&quot;&gt;UI snippets&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ui-snippets&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;UI snippets are pre-built search and chat components you can embed in your website. Visit &lt;a href=&quot;https://search.ai.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;search.ai.cloudflare.com&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to configure and preview components for your AI Search instance.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1842,height=806,format=webp/_astro/ui-snippet-search-modal.nSXbvcsi.png&quot; alt=&quot;Example of the search-modal-snippet component&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1842&quot; height=&quot;806&quot;&gt;
&lt;p&gt;To add a search modal to your page:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;html&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;html&quot; data-nb-lang=&quot;html&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-17hn0y&quot;&gt;script&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;module&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	src&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://&amp;lt;PUBLIC_ENDPOINT_ID&amp;gt;.search.ai.cloudflare.com/assets/v0.0.25/search-snippet.es.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;nb-shiki-17hn0y&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-17hn0y&quot;&gt;search-modal-snippet&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	api-url&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://&lt;/span&gt;&lt;span class=&quot;nb-shiki-2bbn9v&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;PUBLIC_ENDPOINT_ID&amp;gt;.search.ai.cloudflare.com/&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	placeholder&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Search...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;nb-shiki-17hn0y&quot;&gt;search-modal-snippet&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/retrieval/public-endpoint/embed-search-snippets/&quot;&gt;UI snippets documentation&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;mcp&quot;&gt;MCP&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#mcp&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The MCP endpoint allows AI agents to search your content via the Model Context Protocol. Connect your MCP client to:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;https://&amp;lt;PUBLIC_ENDPOINT_ID&amp;gt;.search.ai.cloudflare.com/mcp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/api/search/mcp/&quot;&gt;MCP documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>AI Search - Custom metadata filtering for AI Search</title><link>https://developers.cloudflare.com/changelog/post/2026-03-23-custom-metadata-filtering/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-23-custom-metadata-filtering/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;define-a-custom-metadata-schema&quot;&gt;Define a custom metadata schema&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#define-a-custom-metadata-schema&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can define up to 5 custom metadata fields per AI Search instance. Each field has a name and data type (&lt;code&gt;text&lt;/code&gt;, &lt;code&gt;number&lt;/code&gt;, or &lt;code&gt;boolean&lt;/code&gt;):&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai-search/instances&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer {API_TOKEN}&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;id&quot;: &quot;my-instance&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;type&quot;: &quot;r2&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;source&quot;: &quot;my-bucket&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;custom_metadata&quot;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      { &quot;field_name&quot;: &quot;category&quot;, &quot;data_type&quot;: &quot;text&quot; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      { &quot;field_name&quot;: &quot;version&quot;, &quot;data_type&quot;: &quot;number&quot; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      { &quot;field_name&quot;: &quot;is_public&quot;, &quot;data_type&quot;: &quot;boolean&quot; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;add-metadata-to-your-documents&quot;&gt;Add metadata to your documents&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#add-metadata-to-your-documents&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;How you attach metadata depends on your data source:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;R2 bucket&lt;/strong&gt;: Set metadata using S3-compatible custom headers (&lt;code&gt;x-amz-meta-*&lt;/code&gt;) when uploading objects. Refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/r2/#custom-metadata&quot;&gt;R2 custom metadata&lt;/a&gt; for examples.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Website&lt;/strong&gt;: Add &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tags to your HTML pages. Refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/website/custom-metadata/&quot;&gt;Website custom metadata&lt;/a&gt; for details.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;filter-search-results&quot;&gt;Filter search results&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#filter-search-results&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Use custom metadata fields in your search queries alongside built-in attributes like &lt;code&gt;folder&lt;/code&gt; and &lt;code&gt;timestamp&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai-search/instances/{NAME}/search&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer {API_TOKEN}&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;messages&quot;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;content&quot;: &quot;How do I configure authentication?&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;role&quot;: &quot;user&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;ai_search_options&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;retrieval&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;filters&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;          &quot;category&quot;: &quot;documentation&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;          &quot;version&quot;: { &quot;$gte&quot;: 2.0 }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Learn more in the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/indexing/metadata/&quot;&gt;metadata filtering documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>API Shield - Web Assets fields now available in GraphQL Analytics API</title><link>https://developers.cloudflare.com/changelog/post/2026-03-23-web-assets-graphql-fields/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-23-web-assets-graphql-fields/</guid><description>&lt;p&gt;Two new fields are now available in the &lt;code&gt;httpRequestsAdaptive&lt;/code&gt; and &lt;code&gt;httpRequestsAdaptiveGroups&lt;/code&gt; &lt;a href=&quot;https://developers.cloudflare.com/analytics/graphql-api/&quot;&gt;GraphQL Analytics API&lt;/a&gt; datasets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;webAssetsOperationId&lt;/code&gt; — the ID of the &lt;a href=&quot;https://developers.cloudflare.com/api-shield/management-and-monitoring/&quot;&gt;saved endpoint&lt;/a&gt; that matched the incoming request.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;webAssetsLabelsManaged&lt;/code&gt; — the &lt;a href=&quot;https://developers.cloudflare.com/api-shield/management-and-monitoring/endpoint-labels/#managed-labels&quot;&gt;managed labels&lt;/a&gt; mapped to the matched operation at the time of the request (for example, &lt;code&gt;cf-llm&lt;/code&gt;, &lt;code&gt;cf-log-in&lt;/code&gt;). At most 10 labels are returned per request.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both fields are empty when no operation matched. &lt;code&gt;webAssetsLabelsManaged&lt;/code&gt; is also empty when no managed labels are assigned to the matched operation.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/waf/detections/ai-security-for-apps/&quot;&gt;AI Security for Apps&lt;/a&gt; did or did not flag a request.&lt;/p&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/api-shield/management-and-monitoring/endpoint-labels/#analytics&quot;&gt;Endpoint labeling service&lt;/a&gt; for GraphQL query examples.&lt;/p&gt;</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><product>API Shield</product><category>API Shield</category></item><item><title>R2 SQL - R2 SQL now supports over 190 new functions, expressions, and complex types</title><link>https://developers.cloudflare.com/changelog/post/2026-03-23-expanded-sql-functions-expressions-complex-types/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-23-expanded-sql-functions-expressions-complex-types/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt; 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&apos;s serverless, distributed, analytics query engine for querying &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables stored in &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;. This page documents the supported SQL syntax.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;highlights&quot;&gt;Highlights&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#highlights&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Column aliases&lt;/strong&gt; — &lt;code&gt;SELECT col AS alias&lt;/code&gt; now works in all clauses&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CASE expressions&lt;/strong&gt; — conditional logic directly in SQL (searched and simple forms)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scalar functions&lt;/strong&gt; — 163 new functions across math, string, datetime, regex, crypto, encoding, and type inspection categories&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aggregate functions&lt;/strong&gt; — statistical (variance, stddev, correlation, regression), bitwise, boolean, and positional aggregates join the existing basic and approximate functions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complex types&lt;/strong&gt; — query struct fields with bracket notation, use 46 array functions, and extract map keys/values&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Common table expressions (CTEs)&lt;/strong&gt; — use &lt;code&gt;WITH ... AS&lt;/code&gt; to define named temporary result sets. Chained CTEs are supported. All CTEs must reference the same single table.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full expression support&lt;/strong&gt; — arithmetic, type casting (&lt;code&gt;CAST&lt;/code&gt;, &lt;code&gt;TRY_CAST&lt;/code&gt;, &lt;code&gt;::&lt;/code&gt; shorthand), and &lt;code&gt;EXTRACT&lt;/code&gt; in SELECT, WHERE, GROUP BY, HAVING, and ORDER BY&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;examples&quot;&gt;Examples&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#examples&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;case-expressions-with-statistical-aggregates&quot;&gt;CASE expressions with statistical aggregates&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#case-expressions-with-statistical-aggregates&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; source,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    CASE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        WHEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; AVG&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(price) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 30&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; THEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;premium&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        WHEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; AVG&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(price) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; THEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;mid-tier&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        ELSE&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;budget&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    END&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; tier,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    round&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(stddev(price), &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; price_volatility,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    approx_percentile_cont&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(price, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;95&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; p95_price&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; source&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;struct-and-array-access&quot;&gt;Struct and array access&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#struct-and-array-access&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; product_name,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    pricing[&apos;price&apos;] &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; price,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    array_to_string(tags, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;, &apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; tag_list&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;products&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; array_has(tags, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;Action&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; pricing[&apos;price&apos;] &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LIMIT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;chained-ctes-with-time-series-analysis&quot;&gt;Chained CTEs with time-series analysis&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#chained-ctes-with-time-series-analysis&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WITH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; monthly &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; date_trunc(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;month&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, sale_timestamp) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; month&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        department,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;        COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; transactions,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;        round&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount), &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; avg_amount&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sale_timestamp &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;BETWEEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;2025-01-01T00:00:00Z&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; AND&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;2025-12-31T23:59:59Z&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; date_trunc(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;month&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, sale_timestamp), department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ranked &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; month&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, department, transactions, avg_amount,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        CASE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;            WHEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; avg_amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1000&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; THEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;high-value&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;            WHEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; avg_amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 500&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; THEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;mid-value&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;            ELSE&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;standard&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;        END&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; tier&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; monthly&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; transactions &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 100&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ranked&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; month&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, avg_amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For the full function reference and syntax details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. For limitations and best practices, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/reference/limitations-best-practices/&quot;&gt;Limitations and best practices&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>WAF - WAF Release - 2026-03-23</title><link>https://developers.cloudflare.com/changelog/post/2026-03-23-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-23-waf-release/</guid><description>
&lt;p&gt;This week&apos;s release focuses on new improvements to enhance coverage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Existing rule enhancements have been deployed to improve detection resilience against broad classes of web attacks and strengthen behavioral coverage.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;54ad0465c30d4cd2ac7a707197321c6c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...97321c6c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Command Injection - Generic 9 - URI Vector&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;b31c34a7b29b4aaf9be6883d1eb7a999&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1eb7a999&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;p&gt;&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Command Injection - Generic 9 - Header Vector&lt;/td&gt;
&lt;td&gt;Log&lt;/td&gt;
&lt;td&gt;Disabled&lt;/td&gt;&lt;br&gt;
&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/p&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;155bb67d1061479e995a38510677175f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...0677175f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;p&gt;&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Command Injection - Generic 9 - Body Vector&lt;/td&gt;
&lt;td&gt;Log&lt;/td&gt;
&lt;td&gt;Disabled&lt;/td&gt;&lt;br&gt;
&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/p&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;55fb1c76f0304f6a9d935d03479da68f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...479da68f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;PHP, vBulletin, jQuery File Upload - Code Injection, Dangerous File Upload - CVE:CVE-2018-9206, CVE:CVE-2019-17132 (beta)&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule has been merged into the original rule &quot;PHP, vBulletin, jQuery File Upload - Code Injection, Dangerous File Upload - CVE:CVE-2018-9206, CVE:CVE-2019-17132&quot; (ID: &lt;rule-id id=&quot;0f2da91cec674eb58006929e824b817c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...824b817c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Access - Managed OAuth for Cloudflare Access</title><link>https://developers.cloudflare.com/changelog/post/2026-03-20-managed-oauth/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-20-managed-oauth/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Previously, non-browser clients that attempted to access a protected application received a &lt;code&gt;302&lt;/code&gt; redirect to a login page they could not complete. The established workaround was &lt;code&gt;cloudflared access curl&lt;/code&gt;, which required installing additional tooling.&lt;/p&gt;
&lt;p&gt;With managed OAuth, clients instead receive a &lt;code&gt;401&lt;/code&gt; response with a &lt;code&gt;WWW-Authenticate&lt;/code&gt; header that points to Access&apos;s OAuth discovery endpoints (&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc8414&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 8414&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc9728&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 9728&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;). The client opens the end user&apos;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.&lt;/p&gt;
&lt;p&gt;Access enforces the same policies as a browser login; the OAuth layer is a new transport mechanism, not a separate authentication path.&lt;/p&gt;
&lt;p&gt;Managed OAuth can be enabled on any self-hosted Access application or &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/&quot;&gt;MCP server portal&lt;/a&gt;. It is opt-in for existing applications to avoid interfering with those that run their own OAuth servers and rely on their own &lt;code&gt;WWW-Authenticate&lt;/code&gt; headers.&lt;/p&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;For MCP server portals, managed OAuth is enabled by default on new portals. It remains opt-in for self-hosted applications.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;To enable managed OAuth, go to &lt;strong&gt;Zero Trust&lt;/strong&gt; &amp;gt; &lt;strong&gt;Access controls&lt;/strong&gt; &amp;gt; &lt;strong&gt;Applications&lt;/strong&gt;, edit the application, and turn on &lt;strong&gt;Managed OAuth&lt;/strong&gt; under &lt;strong&gt;Advanced settings&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You can also enable it via the API by setting &lt;code&gt;oauth_configuration.enabled&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; on the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/zero_trust/subresources/access/subresources/applications/methods/update/&quot;&gt;Access applications endpoint&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2914,height=1042,format=webp/_astro/managed-oauth.BirLnBpy.png&quot; alt=&quot;Managed OAuth settings in the Cloudflare dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2914&quot; height=&quot;1042&quot;&gt;
&lt;p&gt;For setup instructions, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/managed-oauth/&quot;&gt;Enable managed OAuth&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Access - Route MCP server portal traffic through Cloudflare Gateway</title><link>https://developers.cloudflare.com/changelog/post/2026-03-20-mcp-portal-gateway-routing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-20-mcp-portal-gateway-routing/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/&quot;&gt;MCP server portals&lt;/a&gt; can now route traffic through &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot;&gt;Cloudflare Gateway&lt;/a&gt; for richer HTTP request logging and data loss prevention (DLP) scanning.&lt;/p&gt;
&lt;p&gt;When Gateway routing is turned on, portal traffic appears in your &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/logs/dashboard-logs/gateway-logs/&quot;&gt;Gateway HTTP logs&lt;/a&gt;. You can create &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot;&gt;Gateway HTTP policies&lt;/a&gt; with &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/&quot;&gt;DLP profiles&lt;/a&gt; to detect and block sensitive data sent to upstream MCP servers.&lt;/p&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;DLP &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/predefined-profiles/#ai-prompt&quot;&gt;AI prompt profiles&lt;/a&gt; do not apply to MCP server portal traffic.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;To enable Gateway routing, go to &lt;strong&gt;Access controls&lt;/strong&gt; &amp;gt; &lt;strong&gt;AI controls&lt;/strong&gt;, edit the portal, and turn on &lt;strong&gt;Route traffic through Cloudflare Gateway&lt;/strong&gt; under &lt;strong&gt;Basic information&lt;/strong&gt;.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1568,height=158,format=webp/_astro/portal-route-through-gateway.0KMUAXBm.png&quot; alt=&quot;Route MCP server portal traffic through Cloudflare Gateway&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1568&quot; height=&quot;158&quot;&gt;
&lt;p&gt;For more details, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/#route-portal-traffic-through-gateway&quot;&gt;Route traffic through Gateway&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>DNS - DNS Analytics for Customer Metadata Boundary set to EU region</title><link>https://developers.cloudflare.com/changelog/post/2026-03-20-dns-analytics-cmb-eu/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-20-dns-analytics-cmb-eu/</guid><description>
&lt;p&gt;DNS Analytics is now available for customers with &lt;a href=&quot;https://developers.cloudflare.com/data-localization/metadata-boundary/&quot;&gt;Customer Metadata Boundary&lt;/a&gt; (CMB) set to EU. Query your DNS analytics data while keeping metadata stored in the EU region.&lt;/p&gt;
&lt;p&gt;This update includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DNS Analytics&lt;/strong&gt; — Access the same DNS analytics experience for zones in CMB=EU accounts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;EU data residency&lt;/strong&gt; — Analytics data is stored and queried from the EU region, meeting data localization requirements.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS Firewall Analytics&lt;/strong&gt; — DNS Firewall analytics is now supported for CMB=EU customers.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;availability&quot;&gt;Availability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#availability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Available to customers with the &lt;a href=&quot;https://developers.cloudflare.com/data-localization/&quot;&gt;Data Localization Suite&lt;/a&gt; who have Customer Metadata Boundary configured for the EU region.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;where-to-find-it&quot;&gt;Where to find it&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#where-to-find-it&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Authoritative DNS:&lt;/strong&gt; In the Cloudflare dashboard, select your zone and go to the &lt;strong&gt;Analytics&lt;/strong&gt; page.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/:zone/dns/analytics&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Analytics&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;
&lt;p&gt;&lt;strong&gt;DNS Firewall:&lt;/strong&gt; In the Cloudflare dashboard, go to the &lt;strong&gt;DNS Firewall Analytics&lt;/strong&gt; page.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/dns-firewall/analytics&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Analytics&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/dns/additional-options/analytics/&quot;&gt;DNS Analytics&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/dns/dns-firewall/analytics/&quot;&gt;DNS Firewall Analytics&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><product>DNS</product><category>DNS</category></item><item><title>Cloudflare Tunnel, Cloudflare Tunnel for SASE - Stream logs from multiple replicas of Cloudflare Tunnel simultaneously</title><link>https://developers.cloudflare.com/changelog/post/2026-03-20-tunnel-replica-overview-and-multi-log-streaming/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-20-tunnel-replica-overview-and-multi-log-streaming/</guid><description>&lt;p&gt;In the Cloudflare One dashboard, the overview page for a specific Cloudflare Tunnel now shows all &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/configure-tunnels/tunnel-availability/&quot;&gt;replicas&lt;/a&gt; of that tunnel and supports streaming logs from multiple replicas at once.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=1040,format=webp/_astro/tunnel-multiconn.DEOEaLlu.gif&quot; alt=&quot;View replicas and stream logs from multiple connectors&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1800&quot; height=&quot;1040&quot;&gt;
&lt;p&gt;Previously, you could only stream logs from one replica at a time. With this update:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Replicas on the tunnel overview&lt;/strong&gt; — All active replicas for the selected tunnel now appear on that tunnel&apos;s overview page under &lt;strong&gt;Connectors&lt;/strong&gt;. Select any replica to stream its logs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-connector log streaming&lt;/strong&gt; — 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 &lt;a href=&quot;https://one.dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare One&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and go to &lt;strong&gt;Networks&lt;/strong&gt; &amp;gt; &lt;strong&gt;Connectors&lt;/strong&gt; &amp;gt; &lt;strong&gt;Cloudflare Tunnels&lt;/strong&gt;. Select &lt;strong&gt;View logs&lt;/strong&gt; next to the tunnel you want to monitor.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/monitor-tunnels/logs/&quot;&gt;Tunnel log streams&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/configure-tunnels/tunnel-availability/deploy-replicas/&quot;&gt;Deploy replicas&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><product>Cloudflare Tunnel</product><category>Cloudflare Tunnel</category><category>Cloudflare Tunnel for SASE</category></item><item><title>Workers VPC - Observability for Workers VPC Services</title><link>https://developers.cloudflare.com/changelog/post/2026-03-20-metrics-and-settings-dashboard/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-20-metrics-and-settings-dashboard/</guid><description>&lt;p&gt;Each VPC Service now has a &lt;strong&gt;Metrics&lt;/strong&gt; tab so you can monitor connection health and debug failures without leaving the dashboard.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3336,height=3204,format=webp/_astro/2026-03-20-metrics-dashboard.6kfnbqQd.png&quot; alt=&quot;Workers VPC Metrics dashboard showing connections, latency, and errors charts&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3336&quot; height=&quot;3204&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Connections&lt;/strong&gt; — See successful and failed connections over time, broken down by what is responsible: your origin (Bad Upstream), your configuration (Client), or Cloudflare (Internal).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latency&lt;/strong&gt; — Track connection and DNS resolution latency trends.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Errors&lt;/strong&gt; — Drill into specific error codes grouped by category, with filters to isolate upstream, client, or internal failures.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also view and edit your VPC Service configuration, host details, and port assignments from the &lt;strong&gt;Settings&lt;/strong&gt; tab.&lt;/p&gt;
&lt;p&gt;For a full list of error codes and what they mean, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/reference/troubleshooting/&quot;&gt;Troubleshooting&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate><product>Workers VPC</product><category>Workers VPC</category></item><item><title>Cloudflare Fundamentals - Service Key authentication deprecated</title><link>https://developers.cloudflare.com/changelog/post/2026-03-19-service-key-authentication-deprecated/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-19-service-key-authentication-deprecated/</guid><description>&lt;p&gt;Service Key authentication for the Cloudflare API is deprecated. Service Keys will stop working on September 30, 2026.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/get-started/create-token/&quot;&gt;API Tokens&lt;/a&gt; replace Service Keys with fine-grained permissions, expiration, and revocation.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-you-need-to-do&quot;&gt;What you need to do&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-you-need-to-do&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Replace any use of the &lt;code&gt;X-Auth-User-Service-Key&lt;/code&gt; header with an &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/get-started/create-token/&quot;&gt;API Token&lt;/a&gt; scoped to the permissions your integration requires.&lt;/p&gt;
&lt;p&gt;If you use &lt;code&gt;cloudflared&lt;/code&gt;, update to a version from November 2022 or later. These versions already use API Tokens.&lt;/p&gt;
&lt;p&gt;If you use &lt;a href=&quot;https://github.com/cloudflare/origin-ca-issuer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;origin-ca-issuer&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, update to a version that supports API Token authentication.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/reference/deprecations/&quot;&gt;API deprecations&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Hyperdrive - Hyperdrive now supports custom TLS/SSL certificates for MySQL</title><link>https://developers.cloudflare.com/changelog/post/2026-03-19-hyperdrive-mysql-custom-certificate-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-19-hyperdrive-mysql-custom-certificate-support/</guid><description>&lt;p&gt;Hyperdrive now supports custom TLS/SSL certificates for MySQL databases, bringing the same certificate options previously available for PostgreSQL to MySQL connections.&lt;/p&gt;
&lt;p&gt;You can now configure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Server certificate verification&lt;/strong&gt; with &lt;code&gt;VERIFY_CA&lt;/code&gt; or &lt;code&gt;VERIFY_IDENTITY&lt;/code&gt; SSL modes to verify that your MySQL database server&apos;s certificate is signed by the expected certificate authority (CA).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client certificates&lt;/strong&gt; (mTLS) for Hyperdrive to authenticate itself to your MySQL database with credentials beyond username and password.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Create a Hyperdrive configuration with custom certificates for MySQL:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Upload a CA certificate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; cert&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; upload&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; certificate-authority&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --ca-cert&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; your-ca-cert.pem&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --name&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; your-custom-ca-name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Create a Hyperdrive with VERIFY_IDENTITY mode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; hyperdrive&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; your-hyperdrive-config&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --connection-string=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;mysql://user:password@hostname:port/database&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --ca-certificate-id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;CA_CERT_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --sslmode&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; VERIFY_IDENTITY&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/configuration/tls-ssl-certificates-for-hyperdrive/&quot;&gt;SSL/TLS certificates for Hyperdrive&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/examples/connect-to-mysql/&quot;&gt;MySQL TLS/SSL modes&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>Cloudflare Tunnel, Workers - Manage Cloudflare Tunnels with Wrangler</title><link>https://developers.cloudflare.com/changelog/post/2026-03-19-wrangler-tunnel-commands/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-19-wrangler-tunnel-commands/</guid><description>&lt;p&gt;You can now manage &lt;a href=&quot;https://developers.cloudflare.com/tunnel/&quot;&gt;Cloudflare Tunnels&lt;/a&gt; directly from &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt;, the CLI for the Cloudflare Developer Platform. The new &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/tunnel/&quot;&gt;&lt;code&gt;wrangler tunnel&lt;/code&gt;&lt;/a&gt; commands let you create, run, and manage tunnels without leaving your terminal.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=1094,format=webp/_astro/wrangler-tunnel.DOqrtGGg.gif&quot; alt=&quot;Wrangler tunnel commands demo&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1800&quot; height=&quot;1094&quot;&gt;
&lt;p&gt;Available commands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wrangler tunnel create&lt;/code&gt; — Create a new remotely managed tunnel.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler tunnel list&lt;/code&gt; — List all tunnels in your account.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler tunnel info&lt;/code&gt; — Display details about a specific tunnel.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler tunnel delete&lt;/code&gt; — Delete a tunnel.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler tunnel run&lt;/code&gt; — Run a tunnel using the cloudflared daemon.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler tunnel quick-start&lt;/code&gt; — Start a free, temporary tunnel without an account using &lt;a href=&quot;https://developers.cloudflare.com/tunnel/setup/#quick-tunnels-development&quot;&gt;Quick Tunnels&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wrangler handles downloading and managing the &lt;a href=&quot;https://developers.cloudflare.com/tunnel/downloads/&quot;&gt;cloudflared&lt;/a&gt; binary automatically. On first use, you will be prompted to download &lt;code&gt;cloudflared&lt;/code&gt; to a local cache directory.&lt;/p&gt;
&lt;p&gt;These commands are currently experimental and may change without notice.&lt;/p&gt;
&lt;p&gt;To get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/tunnel/&quot;&gt;Wrangler tunnel commands documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><product>Cloudflare Tunnel</product><category>Cloudflare Tunnel</category><category>Workers</category></item><item><title>Workers AI - Moonshot AI Kimi K2.5 now available on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2026-03-19-kimi-k2-5-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-19-kimi-k2-5-workers-ai/</guid><description>&lt;p&gt;Workers AI is officially in the big models game. &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.5/&quot;&gt;&lt;code&gt;@cf/moonshotai/kimi-k2.5&lt;/code&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-capabilities&quot;&gt;Key capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;256,000 token context window&lt;/strong&gt; for retaining full conversation history, tool definitions, and entire codebases across long-running agent sessions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-turn tool calling&lt;/strong&gt; for building agents that invoke tools across multiple conversation turns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vision inputs&lt;/strong&gt; for processing images alongside text&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured outputs&lt;/strong&gt; with JSON mode and JSON Schema support for reliable downstream parsing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function calling&lt;/strong&gt; for integrating external tools and APIs into agent workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;prefix-caching-and-session-affinity&quot;&gt;Prefix caching and session affinity&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#prefix-caching-and-session-affinity&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.5/&quot;&gt;model page&lt;/a&gt;).&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  &quot;https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/run/@cf/moonshotai/kimi-k2.5&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer {api_token}&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;x-session-affinity: ses_12345678&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;messages&quot;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;role&quot;: &quot;system&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;content&quot;: &quot;You are a helpful assistant.&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;role&quot;: &quot;user&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;content&quot;: &quot;What is prefix caching and why does it matter?&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;max_tokens&quot;: 2400,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;stream&quot;: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Some clients like &lt;a href=&quot;https://opencode.ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OpenCode&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; implement session affinity automatically. The &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; starter also sets up the wiring for you.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;redesigned-asynchronous-api&quot;&gt;Redesigned asynchronous API&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#redesigned-asynchronous-api&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;For volumes of requests that exceed synchronous rate limits, you can submit batches of inferences to be completed asynchronously. We have revamped the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/batch-api/&quot;&gt;Asynchronous Batch API&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To use the asynchronous API, pass &lt;code&gt;queueRequest: true&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// 1. Push a batch of requests into the queue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; res&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;@cf/moonshotai/kimi-k2.5&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		requests: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				messages: [{ role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, content: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Tell me a joke&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				messages: [{ role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, content: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Explain the Pythagoras theorem&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{ queueRequest: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// 2. Grab the request ID&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; requestId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; res.request_id;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// 3. Poll for the result&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/moonshotai/kimi-k2.5&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	request_id: requestId,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (result.status &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;queued&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; result.status &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;running&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Retry by polling again&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(result);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;You can also set up &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/event-subscriptions/&quot;&gt;event notifications&lt;/a&gt; to know when inference is complete instead of polling.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Use Kimi K2.5 through the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/bindings/&quot;&gt;Workers AI binding&lt;/a&gt; (&lt;code&gt;env.AI.run()&lt;/code&gt;), the REST API at &lt;code&gt;/run&lt;/code&gt; or &lt;code&gt;/v1/chat/completions&lt;/code&gt;, &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt;, or via the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/open-ai-compatibility/&quot;&gt;OpenAI-compatible endpoint&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/kimi-k2.5/&quot;&gt;Kimi K2.5 model page&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/prompt-caching/&quot;&gt;prompt caching&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Cloudflare Fundamentals - SCIM provisioning for Authentik is now Generally Available</title><link>https://developers.cloudflare.com/changelog/post/2026-03-17-scim-authentik-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-17-scim-authentik-support/</guid><description>&lt;p&gt;Cloudflare dashboard SCIM provisioning now supports &lt;a href=&quot;https://goauthentik.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Authentik&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; as an identity provider, joining Okta and Microsoft Entra ID as explicitly supported providers.&lt;/p&gt;
&lt;p&gt;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;amp; groups directly from your Authentik Identity Provider.&lt;/p&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;SCIM provisioning for the Cloudflare dashboard is available to Enterprise customers. You must be a Super Administrator to complete the initial setup.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;For more information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/account/account-security/scim-setup/&quot;&gt;SCIM provisioning overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/account/account-security/scim-setup/authentik/&quot;&gt;Provision with Authentik&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Cloudflare Fundamentals - SCIM audit logging Support</title><link>https://developers.cloudflare.com/changelog/post/2026-03-18-scim-audit-logging/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-18-scim-audit-logging/</guid><description>&lt;p&gt;Cloudflare dashboard SCIM provisioning operations are now captured in &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/&quot;&gt;Audit Logs v2&lt;/a&gt;, giving you visibility into user and group changes made by your identity provider.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2556,height=1332,format=webp/_astro/2026-03-18-scim-audit-logging.DPKMiE8X.png&quot; alt=&quot;SCIM audit logging&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2556&quot; height=&quot;1332&quot;&gt;
&lt;p&gt;&lt;strong&gt;Logged actions:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Create SCIM User&lt;/td&gt;
&lt;td&gt;User provisioned from IdP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replace SCIM User&lt;/td&gt;
&lt;td&gt;User fully replaced (PUT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update SCIM User&lt;/td&gt;
&lt;td&gt;User attributes modified (PATCH)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete SCIM User&lt;/td&gt;
&lt;td&gt;Member deprovisioned&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create SCIM Group&lt;/td&gt;
&lt;td&gt;Group provisioned from IdP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update SCIM Group&lt;/td&gt;
&lt;td&gt;Group membership or attributes modified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delete SCIM Group&lt;/td&gt;
&lt;td&gt;Group deprovisioned&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/&quot;&gt;Audit Logs v2 documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Rules - Worker execution timing field now available in Rules</title><link>https://developers.cloudflare.com/changelog/post/2026-03-18-worker-timing-field/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-18-worker-timing-field/</guid><description>&lt;p&gt;The &lt;code&gt;cf.timings.worker_msec&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;field-details&quot;&gt;Field details&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#field-details&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.timings.worker_msec&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;td&gt;The time spent executing a Cloudflare Worker in milliseconds. Returns &lt;code&gt;0&lt;/code&gt; if no Worker was invoked.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Example filter expression:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;plaintext&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot; data-nb-lang=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;cf.timings.worker_msec &amp;gt; 500&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/cf.timings.worker_msec/&quot;&gt;Fields reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><product>Rules</product><category>Rules</category></item><item><title>Security Center - Real-time logo match preview</title><link>https://developers.cloudflare.com/changelog/post/2026-03-18-brand-protection-logo-match-preview/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-18-brand-protection-logo-match-preview/</guid><description>&lt;p&gt;We are introducing &lt;strong&gt;Logo Match Preview&lt;/strong&gt;, 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What’s new:&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Upload your brand logo and immediately see a sample of potential matches from recently detected sites before finalizing the query&lt;/li&gt;
&lt;li&gt;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&lt;/li&gt;
&lt;li&gt;Review the specific logos triggered by your current settings to ensure your query is capturing the right level of brand infringement&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are ready to test your brand assets, go to the &lt;a href=&quot;https://developers.cloudflare.com/security-center/brand-protection/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Brand Protection dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to try the new preview tool.&lt;/p&gt;</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Stream - Media Transformations binding for Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-03-18-media-transformations-workers-binding/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-18-media-transformations-workers-binding/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The Media Transformations binding is useful when you want to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transform videos stored in private or protected sources&lt;/li&gt;
&lt;li&gt;Optimize videos and store the output directly back to R2 for re-use&lt;/li&gt;
&lt;li&gt;Extract still frames for classification or description with Workers AI&lt;/li&gt;
&lt;li&gt;Extract audio tracks for transcription using Workers AI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, add the Media binding to your Wrangler configuration:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;media&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MEDIA&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;media&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MEDIA&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;Then use the binding in your Worker to transform videos:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; video&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;R2_BUCKET&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;input.mp4&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MEDIA&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(video.body)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ width: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;480&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, height: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;270&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;video&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, duration: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;5s&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; result.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; video&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;R2_BUCKET&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;input.mp4&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MEDIA&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(video.body)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ width: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;480&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, height: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;270&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;video&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, duration: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;5s&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; result.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Output modes include &lt;code&gt;video&lt;/code&gt; for optimized MP4 clips, &lt;code&gt;frame&lt;/code&gt; for still images, &lt;code&gt;spritesheet&lt;/code&gt; for multiple frames, and &lt;code&gt;audio&lt;/code&gt; for M4A extraction.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/stream/transform-videos/bindings/&quot;&gt;Media Transformations binding documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 18 Mar 2026 00:00:00 GMT</pubDate><product>Stream</product><category>Stream</category></item><item><title>Agents, Workers - @cloudflare/codemode v0.2.1: MCP barrel export, zero-dependency main entry point, and custom sandbox modules</title><link>https://developers.cloudflare.com/changelog/post/2026-03-17-codemode-sdk-v0.2.1/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-17-codemode-sdk-v0.2.1/</guid><description>
&lt;p&gt;The latest releases of &lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/codemode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@cloudflare/codemode&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; add a new MCP barrel export, remove &lt;code&gt;ai&lt;/code&gt; and &lt;code&gt;zod&lt;/code&gt; as required peer dependencies from the main entry point, and give you more control over the sandbox.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-cloudflarecodemodemcp-export&quot;&gt;New &lt;code&gt;@cloudflare/codemode/mcp&lt;/code&gt; export&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-cloudflarecodemodemcp-export&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A new &lt;code&gt;@cloudflare/codemode/mcp&lt;/code&gt; entry point provides two functions that wrap MCP servers with Code Mode:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;codeMcpServer({ server, executor })&lt;/code&gt;&lt;/strong&gt; — wraps an existing MCP server with a single &lt;code&gt;code&lt;/code&gt; tool where each upstream tool becomes a typed &lt;code&gt;codemode.*&lt;/code&gt; method.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;openApiMcpServer({ spec, executor, request })&lt;/code&gt;&lt;/strong&gt; — creates &lt;code&gt;search&lt;/code&gt; and &lt;code&gt;execute&lt;/code&gt; MCP tools from an OpenAPI spec with host-side request proxying and automatic &lt;code&gt;$ref&lt;/code&gt; resolution.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { codeMcpServer } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/codemode/mcp&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { DynamicWorkerExecutor } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/codemode&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; executor&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DynamicWorkerExecutor&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ loader: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Wrap an existing MCP server — all its tools become&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// typed methods the LLM can call from generated code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; server&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; codeMcpServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ server: upstreamMcp, executor });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { codeMcpServer } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/codemode/mcp&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { DynamicWorkerExecutor } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/codemode&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; executor&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DynamicWorkerExecutor&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ loader: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Wrap an existing MCP server — all its tools become&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// typed methods the LLM can call from generated code&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; server&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; codeMcpServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ server: upstreamMcp, executor });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;zero-dependency-main-entry-point&quot;&gt;Zero-dependency main entry point&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#zero-dependency-main-entry-point&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Breaking change in v0.2.0:&lt;/strong&gt; &lt;code&gt;generateTypes&lt;/code&gt; and the &lt;code&gt;ToolDescriptor&lt;/code&gt; / &lt;code&gt;ToolDescriptors&lt;/code&gt; types have moved to &lt;code&gt;@cloudflare/codemode/ai&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Before&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { generateTypes } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/codemode&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// After&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { generateTypes } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/codemode/ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Before&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { generateTypes } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/codemode&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// After&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { generateTypes } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/codemode/ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The main entry point (&lt;code&gt;@cloudflare/codemode&lt;/code&gt;) no longer requires the &lt;code&gt;ai&lt;/code&gt; or &lt;code&gt;zod&lt;/code&gt; peer dependencies. It now exports:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Export&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanitizeToolName&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sanitize tool names into valid JS identifiers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;normalizeCode&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Normalize LLM-generated code into async arrow functions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;generateTypesFromJsonSchema&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generate TypeScript type definitions from plain JSON Schema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;jsonSchemaToType&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Convert a single JSON Schema to a TypeScript type string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;DynamicWorkerExecutor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sandboxed code execution via Dynamic Worker Loader&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ToolDispatcher&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;RPC target for dispatching tool calls from sandbox to host&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;ai&lt;/code&gt; and &lt;code&gt;zod&lt;/code&gt; peer dependencies are now optional — only required when importing from &lt;code&gt;@cloudflare/codemode/ai&lt;/code&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;custom-sandbox-modules&quot;&gt;Custom sandbox modules&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#custom-sandbox-modules&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;DynamicWorkerExecutor&lt;/code&gt; now accepts an optional &lt;code&gt;modules&lt;/code&gt; option to inject custom ES modules into the sandbox:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; executor&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DynamicWorkerExecutor&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	loader: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	modules: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;		&quot;utils.js&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`export function add(a, b) { return a + b; }`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Sandbox code can then: import { add } from &quot;utils.js&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; executor&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DynamicWorkerExecutor&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	loader: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	modules: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;		&quot;utils.js&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`export function add(a, b) { return a + b; }`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Sandbox code can then: import { add } from &quot;utils.js&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;internal-normalization-and-sanitization&quot;&gt;Internal normalization and sanitization&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#internal-normalization-and-sanitization&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;DynamicWorkerExecutor&lt;/code&gt; now normalizes code and sanitizes tool names internally. You no longer need to call &lt;code&gt;normalizeCode()&lt;/code&gt; or &lt;code&gt;sanitizeToolName()&lt;/code&gt; before passing code and functions to &lt;code&gt;execute()&lt;/code&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/codemode@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/agents/tools/codemode/&quot;&gt;Code Mode documentation&lt;/a&gt; for the full API reference.&lt;/p&gt;</description><pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>AI Gateway - Log AI Gateway request metadata without storing payloads</title><link>https://developers.cloudflare.com/changelog/post/2026-03-17-collect-log-payload-header/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-17-collect-log-payload-header/</guid><description>&lt;p&gt;AI Gateway now supports the &lt;code&gt;cf-aig-collect-log-payload&lt;/code&gt; header, which controls whether request and response bodies are stored in logs. By default, this header is set to &lt;code&gt;true&lt;/code&gt; and payloads are stored alongside metadata. Set this header to &lt;code&gt;false&lt;/code&gt; to skip payload storage while still logging metadata such as token counts, model, provider, status code, cost, and duration.&lt;/p&gt;
&lt;p&gt;This is useful when you need usage metrics but do not want to persist sensitive prompt or response data.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://gateway.ai.cloudflare.com/v1/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$GATEWAY_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/openai/chat/completions&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;cf-aig-collect-log-payload: false&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;model&quot;: &quot;gpt-4o-mini&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;messages&quot;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;role&quot;: &quot;user&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;content&quot;: &quot;What is the email address and phone number of user123?&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/observability/logging/#collect-log-payload-cf-aig-collect-log-payload&quot;&gt;Logging&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Security Overview - New Security Overview UI</title><link>https://developers.cloudflare.com/changelog/post/2026-03-17-new-security-overview-ui/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-17-new-security-overview-ui/</guid><description>&lt;p&gt;The Security Overview has been updated to provide Application Security customers with more actionable insights and a clearer view of their security posture.&lt;/p&gt;
&lt;p&gt;Key improvements include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Criticality for all Insights&lt;/strong&gt;: Every insight now includes a criticality rating, allowing you to prioritize the most impactful security action items first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Detection Tools Section&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Industry Peer Comparison&lt;/strong&gt; (Enterprise customers): A new module from Security Reports benchmarks your security posture against industry peers, highlighting relative strengths and areas for improvement.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1921,height=958,format=webp/_astro/overview-ui.D7FzaCLm.png&quot; alt=&quot;New Security Overview UI&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1921&quot; height=&quot;958&quot;&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/security/overview/&quot;&gt;Security Overview&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate><product>Security Overview</product><category>Security Overview</category></item><item><title>Vectorize - Return up to 50 query results with values or metadata</title><link>https://developers.cloudflare.com/changelog/post/2026-03-16-topk-limit-increased-to-50/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-16-topk-limit-increased-to-50/</guid><description>&lt;p&gt;You can now set &lt;code&gt;topK&lt;/code&gt; up to &lt;code&gt;50&lt;/code&gt; when a Vectorize query returns values or full metadata. This raises the previous limit of &lt;code&gt;20&lt;/code&gt; for queries that use &lt;code&gt;returnValues: true&lt;/code&gt; or &lt;code&gt;returnMetadata: &quot;all&quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Use the higher limit when you need more matches in a single query response without dropping values or metadata. Refer to the &lt;a href=&quot;https://developers.cloudflare.com/vectorize/reference/client-api/&quot;&gt;Vectorize API reference&lt;/a&gt; for query options and current &lt;code&gt;topK&lt;/code&gt; limits.&lt;/p&gt;</description><pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate><product>Vectorize</product><category>Vectorize</category></item><item><title>Email security - Unlimited result paging in Investigations</title><link>https://developers.cloudflare.com/changelog/post/2026-03-15-infinite-paging-investigations/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-15-infinite-paging-investigations/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/api/resources/email_security/subresources/investigate/methods/list&quot;&gt;Investigations API&lt;/a&gt; now returns up to 10,000 records per page (up from 1,000), with no cap on total result volume across pages.&lt;/p&gt;
&lt;p&gt;For high-volume use cases, we recommend:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/logs/logpush/email-security-logs/&quot;&gt;Logpush&lt;/a&gt; to a SIEM&lt;/strong&gt; for full-fidelity datasets and long-term retention.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SOAR playbooks&lt;/strong&gt; against the async bulk action API for large-scale remediation. Bulk actions initiated from the dashboard remain capped at 1,000 messages per action.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Investigations API&lt;/strong&gt; for report exports larger than 1,000 results, which is the dashboard download cap.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This applies to all Email Security packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advantage&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise + PhishGuard&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Sun, 15 Mar 2026 16:00:00 GMT</pubDate><product>Email security</product><category>Email security</category></item><item><title>Durable Objects, Workers - Access Durable Object name via `ctx.id.name`</title><link>https://developers.cloudflare.com/changelog/post/2026-03-15-durable-object-id-name/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-15-durable-object-id-name/</guid><description>&lt;p&gt;When your Worker accesses a Durable Object via &lt;code&gt;idFromName()&lt;/code&gt; or &lt;code&gt;getByName()&lt;/code&gt;, the same name is now available on &lt;code&gt;ctx.id.name&lt;/code&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/workers/languages/typescript/&quot;&gt;Workers runtime types&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is especially useful for &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/alarms/&quot;&gt;alarms&lt;/a&gt;, where there is no calling client to pass the name as an argument. When an alarm handler runs, &lt;code&gt;ctx.id.name&lt;/code&gt; will hold the same name the object was originally accessed with.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { DurableObject } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ChatRoom&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DurableObject&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getRoomName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;    // ctx.id.name returns the name passed to getByName() or idFromName()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.id.name;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Worker&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stub&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;CHAT_ROOM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getByName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;general&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; roomName&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stub.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getRoomName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Welcome to ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;roomName&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}!`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;code&gt;ctx.id.name&lt;/code&gt; is &lt;code&gt;undefined&lt;/code&gt; in the following cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For Durable Objects created with &lt;code&gt;newUniqueId()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;When accessed via &lt;code&gt;idFromString()&lt;/code&gt;, even if the ID was originally created from a name.&lt;/li&gt;
&lt;li&gt;For &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/id/#name&quot;&gt;names longer than 1,024 bytes&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This works the same way in local development with &lt;code&gt;wrangler dev&lt;/code&gt; as it does in production. Run &lt;code&gt;npm update wrangler&lt;/code&gt; to ensure you are on a version with this support.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/id/#name&quot;&gt;Durable Object ID documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Containers - SSH into running Container instances</title><link>https://developers.cloudflare.com/changelog/post/2026-03-12-ssh-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-12-ssh-support/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To connect, enable &lt;code&gt;wrangler_ssh&lt;/code&gt; in your Container configuration and add your &lt;code&gt;ssh-ed25519&lt;/code&gt; public key to &lt;code&gt;authorized_keys&lt;/code&gt;:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;containers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;wrangler_ssh&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;				&quot;enabled&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;authorized_keys&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;NAME&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;					&quot;public_key&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;YOUR_PUBLIC_KEY_HERE&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler_ssh&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;enabled = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;authorized_keys&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;NAME&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;public_key = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;#x3C;YOUR_PUBLIC_KEY_HERE&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;Then connect with:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ssh&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;INSTANCE_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;You can also run a single command without opening an interactive shell:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ssh&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;INSTANCE_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ls&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -al&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Use &lt;code&gt;wrangler containers instances &amp;lt;APPLICATION&amp;gt;&lt;/code&gt; to find the instance ID for a running Container.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/containers/ssh/&quot;&gt;SSH documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Containers - List Container instances with `wrangler containers instances`</title><link>https://developers.cloudflare.com/changelog/post/2026-03-12-wrangler-containers-instances/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-12-wrangler-containers-instances/</guid><description>&lt;p&gt;A new &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/containers/#containers-instances&quot;&gt;&lt;code&gt;wrangler containers instances&lt;/code&gt;&lt;/a&gt; command lists all instances for a given Container application. This mirrors the instances view in the Cloudflare dashboard.&lt;/p&gt;
&lt;p&gt;The command displays each instance&apos;s ID, name, state, location, version, and creation time:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; instances&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;APPLICATION_I&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;D&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Use the &lt;code&gt;--json&lt;/code&gt; flag for machine-readable output, which is also the default format in non-interactive environments such as CI pipelines.&lt;/p&gt;
&lt;p&gt;For the full list of options, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/containers/#containers-instances&quot;&gt;&lt;code&gt;containers instances&lt;/code&gt; command reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Cloudflare Fundamentals - Retry-After HTTP header for retryable 1xxx errors</title><link>https://developers.cloudflare.com/changelog/post/2026-03-12-retry-after-header-for-1xxx-errors/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-12-retry-after-header-for-1xxx-errors/</guid><description>&lt;p&gt;Cloudflare-generated 1xxx error responses now include a standard &lt;code&gt;Retry-After&lt;/code&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;changes&quot;&gt;Changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Seven retryable error codes now emit &lt;code&gt;Retry-After&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Error code&lt;/th&gt;
&lt;th&gt;Retry-After (seconds)&lt;/th&gt;
&lt;th&gt;Error name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1004&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;DNS resolution error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1005&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;Banned zone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1015&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;Rate limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1033&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;Argo Tunnel error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1038&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;HTTP headers limit exceeded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1200&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;Cache connection limit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1205&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Too many redirects&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The header value matches the existing &lt;code&gt;retry_after&lt;/code&gt; body field in JSON and Markdown responses.&lt;/p&gt;
&lt;p&gt;If a WAF rate limiting rule has already set a dynamic &lt;code&gt;Retry-After&lt;/code&gt; value on the response, that value takes precedence.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;availability&quot;&gt;Availability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#availability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Available for all zones on all plans.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;verify&quot;&gt;Verify&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#verify&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Check for the header on any retryable error:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -s&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --compressed&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -D&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -o&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; /dev/null&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Accept: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -A&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;TestAgent/1.0&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Accept-Encoding: gzip, deflate&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;&amp;lt;YOUR_DOMAIN&amp;gt;/cdn-cgi/error/1015&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; grep&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; retry-after&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9110#section-10.2.3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 9110 section 10.2.3 - Retry-After&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-1xxx-errors/&quot;&gt;Cloudflare 1xxx error documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>WAF - WAF Release - 2026-03-12 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2026-03-12-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-12-emergency-waf-release/</guid><description>
&lt;p&gt;This week&apos;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 &lt;code&gt;Content-Security-Policy&lt;/code&gt; (CSP) HTTP request header.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CVE-2026-1281 &amp;amp; CVE-2026-1340: Ivanti Endpoint Manager Mobile processes HTTP requests through Apache RevwriteMap directives that pass user-controlled input to Bash scripts (&lt;code&gt;/mi/bin/map-appstore-url&lt;/code&gt; and &lt;code&gt;/mi/bin/map-aft-store-url&lt;/code&gt;). Bash scripts do not sanitize user input and are vulnerable to shell arithmetic expansion thereby allowing attackers to achieve unauthenticated remote code execution.&lt;/li&gt;
&lt;li&gt;Generic XSS in CSP Header: This rule identifies malicious payloads embedded within the request&apos;s &lt;code&gt;Content-Security-Policy&lt;/code&gt; 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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;5ae86a9bda0c41dbb905132f796ea2f6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...796ea2f6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Ivanti EPMM - Code Injection - CVE:CVE-2026-1281 CVE:CVE-2026-1340&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;35978af68e374a059e397bf5ee964a8c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ee964a8c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Anomaly:Header:Content-Security-Policy&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Cloudflare Fundamentals - JSON responses and RFC 9457 support for Cloudflare 1xxx errors</title><link>https://developers.cloudflare.com/changelog/post/2026-03-11-json-rfc9457-responses-for-1xxx-errors/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-11-json-rfc9457-responses-for-1xxx-errors/</guid><description>&lt;p&gt;Cloudflare-generated 1xxx errors now return structured JSON when clients send &lt;code&gt;Accept: application/json&lt;/code&gt; or &lt;code&gt;Accept: application/problem+json&lt;/code&gt;. JSON responses follow &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9457&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 9457 (Problem Details for HTTP APIs)&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, so any HTTP client that understands Problem Details can parse the base members without Cloudflare-specific code.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;breaking-change&quot;&gt;Breaking change&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#breaking-change&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The Markdown frontmatter field &lt;code&gt;http_status&lt;/code&gt; has been renamed to &lt;code&gt;status&lt;/code&gt;. Agents consuming Markdown frontmatter should update parsers accordingly.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;changes&quot;&gt;Changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;JSON format.&lt;/strong&gt; Clients sending &lt;code&gt;Accept: application/json&lt;/code&gt; or &lt;code&gt;Accept: application/problem+json&lt;/code&gt; now receive a structured JSON object with the same operational fields as Markdown frontmatter, plus RFC 9457 standard members.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RFC 9457 standard members (JSON only):&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;type&lt;/code&gt; — URI pointing to Cloudflare documentation for the specific error code&lt;/li&gt;
&lt;li&gt;&lt;code&gt;status&lt;/code&gt; — HTTP status code (matching the response status)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt; — short, human-readable summary&lt;/li&gt;
&lt;li&gt;&lt;code&gt;detail&lt;/code&gt; — human-readable explanation specific to this occurrence&lt;/li&gt;
&lt;li&gt;&lt;code&gt;instance&lt;/code&gt; — Ray ID identifying this specific error occurrence&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Field renames:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;http_status&lt;/code&gt; -&amp;gt; &lt;code&gt;status&lt;/code&gt; (JSON and Markdown)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;what_happened&lt;/code&gt; -&amp;gt; &lt;code&gt;detail&lt;/code&gt; (JSON only — Markdown prose sections are unchanged)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Content-Type mirroring.&lt;/strong&gt; Clients sending &lt;code&gt;Accept: application/problem+json&lt;/code&gt; receive &lt;code&gt;Content-Type: application/problem+json; charset=utf-8&lt;/code&gt; back; &lt;code&gt;Accept: application/json&lt;/code&gt; receives &lt;code&gt;application/json; charset=utf-8&lt;/code&gt;. Same body in both cases.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;negotiation-behavior&quot;&gt;Negotiation behavior&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#negotiation-behavior&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Request header sent&lt;/th&gt;
&lt;th&gt;Response format&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept: application/json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JSON (&lt;code&gt;application/json&lt;/code&gt; content type)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept: application/problem+json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JSON (&lt;code&gt;application/problem+json&lt;/code&gt; content type)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept: application/json, text/markdown;q=0.9&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept: text/markdown&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Markdown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept: text/markdown, application/json&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Markdown (equal &lt;code&gt;q&lt;/code&gt;, first-listed wins)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Accept: */*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HTML (default)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;availability&quot;&gt;Availability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#availability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Available now for Cloudflare-generated 1xxx errors.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -s&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --compressed&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Accept: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -A&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;TestAgent/1.0&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Accept-Encoding: gzip, deflate&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;&amp;lt;YOUR_DOMAIN&amp;gt;/cdn-cgi/error/1015&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; jq&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -s&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --compressed&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Accept: application/problem+json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -A&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;TestAgent/1.0&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Accept-Encoding: gzip, deflate&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;&amp;lt;YOUR_DOMAIN&amp;gt;/cdn-cgi/error/1015&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; jq&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9457&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;RFC 9457 — Problem Details for HTTP APIs&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-1xxx-errors/&quot;&gt;Cloudflare 1xxx error documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Log Explorer - Ingest field selection for Log Explorer</title><link>https://developers.cloudflare.com/changelog/post/2026-03-11-ingest-field-selection/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-11-ingest-field-selection/</guid><description>&lt;p&gt;Cloudflare Log Explorer now allows you to customize exactly which data fields are ingested and stored when enabling or managing log datasets.&lt;/p&gt;
&lt;p&gt;Previously, ingesting logs often meant taking an &quot;all or nothing&quot; approach to data fields. With &lt;strong&gt;Ingest Field Selection&lt;/strong&gt;, 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-capabilities&quot;&gt;Key capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Granular control:&lt;/strong&gt; Select only the specific fields you need when enabling a new dataset.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic updates:&lt;/strong&gt; Update fields for existing, already enabled logstreams at any time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Historical consistency:&lt;/strong&gt; Even if you disable a field later, you can still query and receive results for that field for the period it was captured.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data integrity:&lt;/strong&gt; Core fields, such as &lt;code&gt;Timestamp&lt;/code&gt;, are automatically retained to ensure your logs remain searchable and chronologically accurate.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-configuration&quot;&gt;Example configuration&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-configuration&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When configuring a dataset via the dashboard or API, you can define a specific set of fields. The &lt;code&gt;Timestamp&lt;/code&gt; field remains mandatory to ensure data indexability.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;dataset&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;firewall_events&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;enabled&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;fields&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;Timestamp&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;ClientRequestHost&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;ClientIP&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;Action&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;EdgeResponseStatus&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;OriginResponseStatus&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/log-explorer/&quot;&gt;Log Explorer documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate><product>Log Explorer</product><category>Log Explorer</category></item><item><title>Workers AI - NVIDIA Nemotron 3 Super now available on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2026-03-11-nemotron-3-super-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-11-nemotron-3-super-workers-ai/</guid><description>
&lt;p&gt;We&apos;re excited to partner with NVIDIA to bring &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/nemotron-3-120b-a12b/&quot;&gt;&lt;code&gt;@cf/nvidia/nemotron-3-120b-a12b&lt;/code&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key capabilities:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hybrid Mamba-transformer architecture&lt;/strong&gt; delivers over 50% higher token generation throughput compared to leading open models, reducing latency for real-world applications&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool calling&lt;/strong&gt; support for building AI agents that invoke tools across multiple conversation turns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-Token Prediction (MTP)&lt;/strong&gt; accelerates long-form text generation by predicting several future tokens simultaneously in a single forward pass&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;32,000 token context window&lt;/strong&gt; for retaining conversation history and plan states across multi-step agent workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Prompt caching&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Prompt caching&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;For optimal performance with multi-turn conversations, send the &lt;code&gt;x-session-affinity&lt;/code&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/prompt-caching/&quot;&gt;Prompt caching&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;Use Nemotron 3 Super through the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/bindings/&quot;&gt;Workers AI binding&lt;/a&gt; (&lt;code&gt;env.AI.run()&lt;/code&gt;), the REST API at &lt;code&gt;/run&lt;/code&gt; or &lt;code&gt;/v1/chat/completions&lt;/code&gt;, or the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/open-ai-compatibility/&quot;&gt;OpenAI-compatible endpoint&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/nemotron-3-120b-a12b/&quot;&gt;Nemotron 3 Super model page&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Cloudflare One Client - WARP client for macOS (version 2026.3.566.1)</title><link>https://developers.cloudflare.com/changelog/post/2026-03-10-warp-macos-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-10-warp-macos-beta/</guid><description>&lt;p&gt;A new Beta release for the macOS WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/&quot;&gt;beta releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://community.cloudflare.com/t/introducing-the-new-cloudflare-one-client-interface/901362&quot;&gt;Cloudflare Community forum&lt;/a&gt; and let us know.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Empty MDM files are now rejected instead of being incorrectly accepted as a single MDM config.&lt;/li&gt;
&lt;li&gt;Fixed an issue in proxy mode where the client could become unresponsive due to upstream connection timeouts.&lt;/li&gt;
&lt;li&gt;Fixed emergency disconnect state from a previous organization incorrectly persisting after switching organizations.&lt;/li&gt;
&lt;li&gt;Consumer-only CLI commands are now clearly distinguished from Zero Trust commands.&lt;/li&gt;
&lt;li&gt;Added detailed QUIC connection metrics to diagnostic logs for better troubleshooting.&lt;/li&gt;
&lt;li&gt;Added monitoring for tunnel statistics collection timeouts.&lt;/li&gt;
&lt;li&gt;Switched tunnel congestion control algorithm to Cubic for improved reliability across platforms.&lt;/li&gt;
&lt;li&gt;Fixed initiating managed network detection checks when no network is available, which caused device profile flapping.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The client may become stuck in a &lt;code&gt;Connecting&lt;/code&gt; state. To resolve this issue, reconnect the client by selecting &lt;strong&gt;Disconnect&lt;/strong&gt; and then &lt;strong&gt;Connect&lt;/strong&gt; in the client user interface. Alternatively, change the client&amp;#39;s operation mode.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 10 Mar 2026 17:10:39 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - WARP client for Windows (version 2026.3.566.1)</title><link>https://developers.cloudflare.com/changelog/post/2026-03-10-warp-windows-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-10-warp-windows-beta/</guid><description>&lt;p&gt;A new Beta release for the Windows WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/&quot;&gt;beta releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://community.cloudflare.com/t/introducing-the-new-cloudflare-one-client-interface/901362&quot;&gt;Cloudflare Community forum&lt;/a&gt; and let us know.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consumer-only CLI commands are now clearly distinguished from Zero Trust commands.&lt;/li&gt;
&lt;li&gt;Added detailed QUIC connection metrics to diagnostic logs for better troubleshooting.&lt;/li&gt;
&lt;li&gt;Added monitoring for tunnel statistics collection timeouts.&lt;/li&gt;
&lt;li&gt;Switched tunnel congestion control algorithm to Cubic for improved reliability across platforms.&lt;/li&gt;
&lt;li&gt;Fixed packet capture failing on tunnel interface when the tunnel interface is renamed by SCCM VPN boundary support.&lt;/li&gt;
&lt;li&gt;Fixed unnecessary registration deletion caused by RDP connections in multi-user mode.&lt;/li&gt;
&lt;li&gt;Fixed increased tunnel interface start-up time due to a race between duplicate address detection (DAD) and disabling NetBT.&lt;/li&gt;
&lt;li&gt;Fixed tunnel failing to connect when the system DNS search list contains unexpected characters.&lt;/li&gt;
&lt;li&gt;Empty MDM files are now rejected instead of being incorrectly accepted as a single MDM config.&lt;/li&gt;
&lt;li&gt;Fixed an issue in proxy mode where the client could become unresponsive due to upstream connection timeouts.&lt;/li&gt;
&lt;li&gt;Fixed emergency disconnect state from a previous organization incorrectly persisting after switching organizations.&lt;/li&gt;
&lt;li&gt;Fixed initiating managed network detection checks when no network is available, which caused device profile flapping.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;An error indicating that Microsoft Edge can&amp;#39;t read and write to its data directory may be displayed during captive portal login; this error is benign and can be dismissed.&lt;/li&gt;
&lt;li&gt;The client may become stuck in a &lt;code&gt;Connecting&lt;/code&gt; state. To resolve this issue, reconnect the client by selecting &lt;strong&gt;Disconnect&lt;/strong&gt; and then &lt;strong&gt;Connect&lt;/strong&gt; in the client user interface. Alternatively, change the client&amp;#39;s operation mode.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd&quot;&gt;Windows 11 24H2 version KB5062553&lt;/a&gt; or higher for resolution.&lt;/li&gt;
&lt;li&gt;Devices with KB5055523 installed may receive a warning about &lt;code&gt;Win32/ClickFix.ABA&lt;/code&gt; being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to &lt;a href=&quot;https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0&quot;&gt;version 1.429.19.0&lt;/a&gt; or later. This warning will be omitted from future release notes. This Microsoft Security Intelligence update was released in May 2025.&lt;/li&gt;
&lt;li&gt;DNS resolution may be broken when the following conditions are all true:&lt;ul&gt;
&lt;li&gt;The client is in Secure Web Gateway without DNS filtering (tunnel-only) mode.&lt;/li&gt;
&lt;li&gt;A custom DNS server address is configured on the primary network adapter.&lt;/li&gt;
&lt;li&gt;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 &lt;strong&gt;Disconnect&lt;/strong&gt; and then &lt;strong&gt;Connect&lt;/strong&gt; in the client user interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 10 Mar 2026 17:10:37 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Audit Logs - Audit logs (version 2) - General Availability</title><link>https://developers.cloudflare.com/changelog/post/2026-03-10-audit-logs-v2-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-10-audit-logs-v2-ga/</guid><description>&lt;p&gt;Audit Logs v2 is now generally available to all Cloudflare customers.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=800,height=319,format=webp/_astro/auditlogsv2.C3pqAR33.gif&quot; alt=&quot;Audit Logs v2 GA&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;319&quot;&gt;
&lt;p&gt;Audit Logs v2 provides a unified and standardized system for tracking and recording all user and system actions across Cloudflare products. Built on Cloudflare&apos;s API Shield / OpenAPI gateway, logs are generated automatically without requiring manual instrumentation from individual product teams, ensuring consistency across ~95% of Cloudflare products.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What&apos;s available at GA:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Standardized logging&lt;/strong&gt; — Audit logs follow a consistent format across all Cloudflare products, making it easier to search, filter, and investigate activity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expanded product coverage&lt;/strong&gt; — ~95% of Cloudflare products covered, up from ~75% in v1.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Granular filtering&lt;/strong&gt; — Filter by actor, action type, action result, resource, raw HTTP method, zone, and more. Over 20 filter parameters available via the API.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhanced context&lt;/strong&gt; — Each log entry includes authentication method, interface (API or dashboard), Cloudflare Ray ID, and actor token details.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;18-month retention&lt;/strong&gt; — Logs are retained for 18 months. Full history is accessible via the API or Logpush.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Access:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dashboard&lt;/strong&gt;: Go to &lt;strong&gt;Manage Account&lt;/strong&gt; &amp;gt; &lt;strong&gt;Audit Logs&lt;/strong&gt;. Audit Logs v2 is shown by default.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API&lt;/strong&gt;: &lt;code&gt;GET https://api.cloudflare.com/client/v4/accounts/{account_id}/logs/audit&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logpush&lt;/strong&gt;: Available via the &lt;code&gt;audit_logs_v2&lt;/code&gt; account-scoped dataset.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Important notes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET&lt;/code&gt; requests (view actions) and &lt;code&gt;4xx&lt;/code&gt; error responses are not logged at GA. &lt;code&gt;GET&lt;/code&gt; logging will be selectively re-enabled for sensitive read operations in a future release.&lt;/li&gt;
&lt;li&gt;Audit Logs v1 continues to run in parallel. A deprecation timeline will be communicated separately.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/&quot;&gt;Audit Logs v2 documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><product>Audit Logs</product><category>Audit Logs</category></item><item><title>Browser Run - Crawl entire websites with a single API call using Browser Rendering</title><link>https://developers.cloudflare.com/changelog/post/2026-03-10-br-crawl-endpoint/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-10-br-crawl-endpoint/</guid><description>&lt;p&gt;&lt;em&gt;Edit: this post has been edited to clarify crawling behavior with respect to site guidance.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You can now crawl an entire website with a single API call using &lt;a href=&quot;https://developers.cloudflare.com/browser-run/&quot;&gt;Browser Rendering&lt;/a&gt;&apos;s new &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/crawl-endpoint/&quot;&gt;&lt;code&gt;/crawl&lt;/code&gt; endpoint&lt;/a&gt;, 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 &lt;a href=&quot;https://developers.cloudflare.com/bots/concepts/bot/verified-bots/&quot;&gt;verified bot (intermediary agent)&lt;/a&gt; that respects robots.txt and &lt;a href=&quot;https://www.cloudflare.com/ai-crawl-control/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI Crawl Control&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Crawl jobs run asynchronously. You submit a URL, receive a job ID, and check back for results as pages are processed.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Initiate a crawl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer &amp;lt;apiToken&amp;gt;&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;url&quot;: &quot;https://blog.cloudflare.com/&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Check results&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; GET&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;https://api.cloudflare.com/client/v4/accounts/{account_id}/browser-rendering/crawl/{job_id}&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer &amp;lt;apiToken&amp;gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Key features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multiple output formats&lt;/strong&gt; - Return crawled content as HTML, Markdown, and structured JSON (powered by &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crawl scope controls&lt;/strong&gt; - Configure crawl depth, page limits, and wildcard patterns to include or exclude specific URL paths&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Automatic page discovery&lt;/strong&gt; - Discovers URLs from sitemaps, page links, or both&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incremental crawling&lt;/strong&gt; - Use &lt;code&gt;modifiedSince&lt;/code&gt; and &lt;code&gt;maxAge&lt;/code&gt; to skip pages that haven&apos;t changed or were recently fetched, saving time and cost on repeated crawls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Static mode&lt;/strong&gt; - Set &lt;code&gt;render: false&lt;/code&gt; to fetch static HTML without spinning up a browser, for faster crawling of static sites&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Well-behaved bot&lt;/strong&gt; - Honors &lt;code&gt;robots.txt&lt;/code&gt; directives, including &lt;code&gt;crawl-delay&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Available on both the Workers Free and Paid plans.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: the /crawl endpoint cannot bypass Cloudflare bot detection or captchas, and self-identifies as a bot.&lt;/p&gt;
&lt;p&gt;To get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/crawl-endpoint/&quot;&gt;crawl endpoint documentation&lt;/a&gt;.
If you are setting up your own site to be crawled, review the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/reference/robots-txt/&quot;&gt;robots.txt and sitemaps best practices&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>API Shield - New Vulnerability Scanner for API Shield</title><link>https://developers.cloudflare.com/changelog/post/2026-03-09-vulnerability-scanner/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-09-vulnerability-scanner/</guid><description>&lt;p&gt;Introducing Cloudflare&apos;s Web and API Vulnerability Scanner (Open Beta)&lt;/p&gt;
&lt;p&gt;Cloudflare is launching the &lt;a href=&quot;https://blog.cloudflare.com/vulnerability-scanner&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Open Beta of the &lt;strong&gt;Web and API Vulnerability Scanner&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; for all &lt;a href=&quot;https://developers.cloudflare.com/api-shield/&quot;&gt;API Shield&lt;/a&gt; customers. This new, stateful Dynamic Application Security Testing (DAST) platform helps teams proactively find logic flaws in their APIs.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Access&lt;/strong&gt;: 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: Refer to the &lt;a href=&quot;https://developers.cloudflare.com/api-shield/security/vulnerability-scanner/&quot;&gt;developer documentation&lt;/a&gt; to start scanning your endpoints today.&lt;/p&gt;</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><product>API Shield</product><category>API Shield</category></item><item><title>Logs - New MCP Portal Logs dataset and new fields across multiple Logpush datasets in Cloudflare Logs</title><link>https://developers.cloudflare.com/changelog/post/2026-03-09-log-fields-updated/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-09-log-fields-updated/</guid><description>&lt;p&gt;Cloudflare has added new fields across multiple &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/&quot;&gt;Logpush datasets&lt;/a&gt;:&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-dataset&quot;&gt;New dataset&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-dataset&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MCP Portal Logs&lt;/strong&gt;: A new dataset with fields including &lt;code&gt;ClientCountry&lt;/code&gt;, &lt;code&gt;ClientIP&lt;/code&gt;, &lt;code&gt;ColoCode&lt;/code&gt;, &lt;code&gt;Datetime&lt;/code&gt;, &lt;code&gt;Error&lt;/code&gt;, &lt;code&gt;Method&lt;/code&gt;, &lt;code&gt;PortalAUD&lt;/code&gt;, &lt;code&gt;PortalID&lt;/code&gt;, &lt;code&gt;PromptGetName&lt;/code&gt;, &lt;code&gt;ResourceReadURI&lt;/code&gt;, &lt;code&gt;ServerAUD&lt;/code&gt;, &lt;code&gt;ServerID&lt;/code&gt;, &lt;code&gt;ServerResponseDurationMs&lt;/code&gt;, &lt;code&gt;ServerURL&lt;/code&gt;, &lt;code&gt;SessionID&lt;/code&gt;, &lt;code&gt;Success&lt;/code&gt;, &lt;code&gt;ToolCallName&lt;/code&gt;, &lt;code&gt;UserEmail&lt;/code&gt;, and &lt;code&gt;UserID&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-fields-in-existing-datasets&quot;&gt;New fields in existing datasets&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-fields-in-existing-datasets&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DEX Application Tests&lt;/strong&gt;: &lt;code&gt;HTTPRedirectEndMs&lt;/code&gt;, &lt;code&gt;HTTPRedirectStartMs&lt;/code&gt;, &lt;code&gt;HTTPResponseBody&lt;/code&gt;, and &lt;code&gt;HTTPResponseHeaders&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DEX Device State Events&lt;/strong&gt;: &lt;code&gt;ExperimentalExtra&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Firewall Events&lt;/strong&gt;: &lt;code&gt;FraudUserID&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gateway HTTP&lt;/strong&gt;: &lt;code&gt;AppControlInfo&lt;/code&gt; and &lt;code&gt;ApplicationStatuses&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gateway DNS&lt;/strong&gt;: &lt;code&gt;InternalDNSDurationMs&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP Requests&lt;/strong&gt;: &lt;code&gt;FraudEmailRisk&lt;/code&gt;, &lt;code&gt;FraudUserID&lt;/code&gt;, and &lt;code&gt;PayPerCrawlStatus&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network Analytics Logs&lt;/strong&gt;: &lt;code&gt;DNSQueryName&lt;/code&gt;, &lt;code&gt;DNSQueryType&lt;/code&gt;, and &lt;code&gt;PFPCustomTag&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WARP Toggle Changes&lt;/strong&gt;: &lt;code&gt;UserEmail&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WARP Config Changes&lt;/strong&gt;: &lt;code&gt;UserEmail&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero Trust Network Session Logs&lt;/strong&gt;: &lt;code&gt;SNI&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the complete field definitions for each dataset, refer to &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/&quot;&gt;Logpush datasets&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>Workflows, Workers - Workflow steps now expose retry attempt number via step context</title><link>https://developers.cloudflare.com/changelog/post/2026-03-06-step-context-available/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-06-step-context-available/</guid><description>&lt;p&gt;Cloudflare Workflows allows you to configure specific retry logic for each step in your workflow execution. Now, you can access &lt;strong&gt;which&lt;/strong&gt; retry attempt is currently executing for calls to &lt;code&gt;step.do()&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-step&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// ctx.attempt is 1 on first try, 2 on first retry, etc.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Attempt ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;attempt&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;You can use the step context for improved logging &amp;amp; observability, progressive backoff, or conditional logic in your workflow definition.&lt;/p&gt;
&lt;p&gt;Note that the current attempt number is 1-indexed. For more information on retry behavior, refer to &lt;a href=&quot;https://developers.cloudflare.com/workflows/build/sleeping-and-retrying/&quot;&gt;Sleeping and Retrying&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 06 Mar 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Radar - Region Filtering, AS Traffic Volume, and Navigation Improvements on Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-03-06-radar-region-filtering-traffic-volume-navigation/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-06-radar-region-filtering-traffic-volume-navigation/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; ships several new features that improve the flexibility and usability of the platform, as well as visibility into what is happening on the Internet.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;region-filtering&quot;&gt;Region filtering&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#region-filtering&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;All location-aware pages now support filtering by region, including continents, geographic subregions (&lt;a href=&quot;https://radar.cloudflare.com/middle-east&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Middle East&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://radar.cloudflare.com/eastern-asia&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Eastern Asia&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, etc.), political regions (&lt;a href=&quot;https://radar.cloudflare.com/european-union&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;EU&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://radar.cloudflare.com/african-union&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;African Union&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;), and US Census regions/divisions (for example, &lt;a href=&quot;https://radar.cloudflare.com/traffic/us-new-england&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;New England&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://radar.cloudflare.com/traffic/us-northeast&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;US Northeast&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1108,format=webp/_astro/region-filtering-middle-east.D__dYNBw.png&quot; alt=&quot;Screenshot of region filtering on Radar - Middle east&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;1108&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;traffic-volume-by-top-autonomous-systems-and-locations&quot;&gt;Traffic volume by top autonomous systems and locations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#traffic-volume-by-top-autonomous-systems-and-locations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=928,format=webp/_astro/traffic-volume-top-as-us.DhnbB8gy.png&quot; alt=&quot;Screenshot of traffic volume by top autonomous systems in US&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;928&quot;&gt;
&lt;p&gt;The new AS and location dimensions have also been added to the &lt;a href=&quot;https://radar.cloudflare.com/explorer&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Data Explorer&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; for the HTTP, DNS, and NetFlows datasets. Combined with other available filters, this provides a powerful tool for generating unique insights.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1486,format=webp/_astro/data-explorer-top-as-pt.DAWOCd_b.png&quot; alt=&quot;Screenshot of AS and location dimensions in Data Explorer&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;1486&quot;&gt;
&lt;p&gt;Finally, breadcrumb navigation is now available on most pages, allowing easier navigation between parent and related pages.&lt;/p&gt;
&lt;p&gt;Check out these features on &lt;a href=&quot;https://radar.cloudflare.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Radar&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Workers AI, Realtime - Real-time transcription in RealtimeKit now supports 10 languages with regional variants</title><link>https://developers.cloudflare.com/changelog/post/2026-03-06-realtimekit-multilingual-transcription/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-06-realtimekit-multilingual-transcription/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/&quot;&gt;Real-time transcription&lt;/a&gt; in RealtimeKit now supports 10 languages with regional variants, powered by &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/nova-3/&quot;&gt;Deepgram Nova-3&lt;/a&gt; running on &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;During a meeting, participant audio is routed through &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt; to Nova-3 on Workers AI — so transcription runs on Cloudflare&apos;s network end-to-end, reducing latency compared to routing through external speech-to-text services.&lt;/p&gt;
&lt;p&gt;Set the language when &lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/concepts/meeting/&quot;&gt;creating a meeting&lt;/a&gt; via &lt;code&gt;ai_config.transcription.language&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;ai_config&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;transcription&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;language&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;fr&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Supported languages include English, Spanish, French, German, Hindi, Russian, Portuguese, Japanese, Italian, and Dutch — with regional variants like &lt;code&gt;en-AU&lt;/code&gt;, &lt;code&gt;en-GB&lt;/code&gt;, &lt;code&gt;en-IN&lt;/code&gt;, &lt;code&gt;en-NZ&lt;/code&gt;, &lt;code&gt;es-419&lt;/code&gt;, &lt;code&gt;fr-CA&lt;/code&gt;, &lt;code&gt;de-CH&lt;/code&gt;, &lt;code&gt;pt-BR&lt;/code&gt;, and &lt;code&gt;pt-PT&lt;/code&gt;. Use &lt;code&gt;multi&lt;/code&gt; for automatic multilingual detection.&lt;/p&gt;
&lt;p&gt;If you are building voice agents or real-time translation workflows, your agent can now transcribe in the caller&apos;s language natively — no extra services or routing logic needed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/realtime/realtimekit/ai/transcription/&quot;&gt;Transcription docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/nova-3/&quot;&gt;Nova-3 model page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category><category>Realtime</category></item><item><title>Security Center - Dismiss and filter matches in Brand Protection</title><link>https://developers.cloudflare.com/changelog/post/2026-03-06-brand-protection-dismiss-match/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-06-brand-protection-dismiss-match/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dismiss matches&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Show/Hide toggle&lt;/strong&gt;: A new visibility control allows you to instantly switch between viewing only active matches and including previously dismissed ones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Persistent review states&lt;/strong&gt;: Dismissed status is saved across sessions, ensuring that your workspace remains organized and focused on new or high-priority threats.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-benefits-of-the-dismiss-match-functionality&quot;&gt;Key benefits of the dismiss match functionality:&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-benefits-of-the-dismiss-match-functionality&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Reduce alert fatigue by hiding known-safe results, allowing your team to focus exclusively on unreviewed or high-risk infringements.&lt;/li&gt;
&lt;li&gt;Auditability and recovery through the visibility toggle, ensuring that no match is ever truly &quot;lost&quot; and can be re-evaluated if a site&apos;s content changes.&lt;/li&gt;
&lt;li&gt;Improved collaboration as your team members can see which matches have already been vetted and dismissed by others.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready to clean up your match queue? Learn more in our &lt;a href=&quot;https://developers.cloudflare.com/security-center/brand-protection/&quot;&gt;Brand Protection documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Browser Run - Browser Rendering: 3x higher REST API request rate</title><link>https://developers.cloudflare.com/changelog/post/2026-03-04-br-rest-api-limit-increase/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-04-br-rest-api-limit-increase/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/&quot;&gt;Browser Rendering&lt;/a&gt; REST API rate limits for Workers Paid plans have been increased from 3 requests per second (180/min) to &lt;strong&gt;10 requests per second (600/min)&lt;/strong&gt;. No action is needed to benefit from the higher limit.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=916,height=85,format=webp/_astro/rest-api-limit-increase.DJHY7xYF.png&quot; alt=&quot;Browser Rendering REST API rate limit increased from 3 to 10 requests per second&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;916&quot; height=&quot;85&quot;&gt;
&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/&quot;&gt;REST API&lt;/a&gt; lets you perform common browser tasks with a single API call, and you can now do it at a higher rate.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/content-endpoint/&quot;&gt;/content - Fetch HTML&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/screenshot-endpoint/&quot;&gt;/screenshot - Capture screenshot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/pdf-endpoint/&quot;&gt;/pdf - Render PDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/markdown-endpoint/&quot;&gt;/markdown - Extract Markdown from a webpage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/snapshot/&quot;&gt;/snapshot - Take a webpage snapshot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/scrape-endpoint/&quot;&gt;/scrape - Scrape HTML elements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/json-endpoint/&quot;&gt;/json - Capture structured data using AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/links-endpoint/&quot;&gt;/links - Retrieve links from a webpage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you use the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/#integration-methods&quot;&gt;Browser Sessions&lt;/a&gt; method, increases to concurrent browser and new browser limits are coming soon. Stay tuned.&lt;/p&gt;
&lt;p&gt;For full details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/limits/&quot;&gt;Browser Rendering limits page&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>Cloudflare One, Access - User risk score selector in Access policies</title><link>https://developers.cloudflare.com/changelog/post/2026-03-04-user-risk-score-access-policies/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-04-user-risk-score-access-policies/</guid><description>&lt;p&gt;You can now use &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/users/risk-score/&quot;&gt;user risk scores&lt;/a&gt; in your &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/&quot;&gt;Access policies&lt;/a&gt;. The new &lt;strong&gt;User Risk Score&lt;/strong&gt; selector allows you to create Access policies that respond to user behavior patterns detected by Cloudflare&apos;s risk scoring system, including impossible travel, high DLP policy matches, and more.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/users/risk-score/#use-risk-scores-in-access-policies&quot;&gt;Use risk scores in Access policies&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category><category>Access</category></item><item><title>Gateway - Gateway Authorization Proxy and hosted PAC files (open beta)</title><link>https://developers.cloudflare.com/changelog/post/2026-03-04-gateway-authorization-proxy-open-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-04-gateway-authorization-proxy-open-beta/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#authorization-endpoint&quot;&gt;Gateway Authorization Proxy&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#create-a-hosted-pac-file&quot;&gt;PAC file hosting&lt;/a&gt; are now in open beta for all plan types.&lt;/p&gt;
&lt;p&gt;Previously, &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#source-ip-endpoint&quot;&gt;proxy endpoints&lt;/a&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/&quot;&gt;Cloudflare Access&lt;/a&gt; authentication, verifying who a user is before applying Gateway filtering without installing the WARP client.&lt;/p&gt;
&lt;p&gt;This is ideal for environments where you cannot deploy a device client, such as virtual desktops (VDI), mergers and acquisitions, or compliance-restricted endpoints.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-capabilities&quot;&gt;Key capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Identity-aware proxy traffic&lt;/strong&gt; — 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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/identity-selectors/&quot;&gt;identity-based policies&lt;/a&gt; like &quot;only the Finance team can access this accounting tool.&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multiple identity providers&lt;/strong&gt; — Display one or multiple login methods simultaneously, giving flexibility for organizations managing users across different identity systems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare-hosted PAC files&lt;/strong&gt; — Create and host &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#create-a-hosted-pac-file&quot;&gt;PAC files&lt;/a&gt; directly in Cloudflare One with pre-configured templates for Okta and Azure, hosted at &lt;code&gt;https://pac.cloudflare-gateway.com/&amp;lt;account-id&amp;gt;/&amp;lt;slug&amp;gt;&lt;/code&gt; on Cloudflare&apos;s global network.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplified billing&lt;/strong&gt; — Each user occupies a seat, exactly like they do with the Cloudflare One Client. No new metrics to track.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;In &lt;a href=&quot;https://one.dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare One&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, go to &lt;strong&gt;Networks&lt;/strong&gt; &amp;gt; &lt;strong&gt;Resolvers &amp;amp; Proxies&lt;/strong&gt; &amp;gt; &lt;strong&gt;Proxy endpoints&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#authorization-endpoint&quot;&gt;Create an authorization proxy endpoint&lt;/a&gt; and configure Access policies.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#create-a-hosted-pac-file&quot;&gt;Create a hosted PAC file&lt;/a&gt; or write your own.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/#3b-configure-browser-to-use-pac-file&quot;&gt;Configure browsers&lt;/a&gt; to use the PAC file URL.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/user-side-certificates/&quot;&gt;Install the Cloudflare certificate&lt;/a&gt; for HTTPS inspection.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/proxy-endpoints/&quot;&gt;proxy endpoints documentation&lt;/a&gt; and the &lt;a href=&quot;https://blog.cloudflare.com/gateway-authorization-proxy-identity-aware-policies/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;announcement blog post&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category></item><item><title>Workers AI - New conversion options for Markdown Conversion</title><link>https://developers.cloudflare.com/changelog/post/2026-03-04-new-markdown-conversion-options/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-04-new-markdown-conversion-options/</guid><description>
&lt;p&gt;You can now customize how the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/&quot;&gt;Markdown Conversion&lt;/a&gt; service processes different file types by passing a &lt;code&gt;conversionOptions&lt;/code&gt; object.&lt;/p&gt;
&lt;p&gt;Available options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Images&lt;/strong&gt;: Set the language for AI-generated image descriptions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTML&lt;/strong&gt;: Use CSS selectors to extract specific content, or provide a hostname to resolve relative links&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PDF&lt;/strong&gt;: Exclude metadata from the output&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/usage/binding/&quot;&gt;&lt;code&gt;env.AI&lt;/code&gt;&lt;/a&gt; binding:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toMarkdown&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;page.html&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, blob: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Blob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;([html]) },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		conversionOptions: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			html: { cssSelector: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;article.content&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			image: { descriptionLanguage: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;es&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toMarkdown&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{ name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;page.html&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, blob: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Blob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;([html]) },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		conversionOptions: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			html: { cssSelector: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;article.content&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			image: { descriptionLanguage: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;es&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;Or call the REST API:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/tomarkdown&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer {API_TOKEN}&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -F&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;files=@index.html&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -F&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;conversionOptions={&quot;html&quot;: {&quot;cssSelector&quot;: &quot;article.content&quot;}}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more details, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/conversion-options/&quot;&gt;Conversion Options&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workflows, Workers - Workflows step limit increased to 25,000 steps per instance</title><link>https://developers.cloudflare.com/changelog/post/2026-03-03-step-limits-to-25k/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-03-step-limits-to-25k/</guid><description>&lt;p&gt;Each Workflow on Workers Paid now supports 10,000 steps by default, configurable up to 25,000 steps in your &lt;code&gt;wrangler.jsonc&lt;/code&gt; file:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-workflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_WORKFLOW&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;class_name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MyWorkflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;limits&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;				&quot;steps&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;25000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Note that the maximum persisted state limit per Workflow instance remains &lt;strong&gt;100 MB&lt;/strong&gt; for Workers Free and &lt;strong&gt;1 GB&lt;/strong&gt; for Workers Paid. Refer to &lt;a href=&quot;https://developers.cloudflare.com/workflows/reference/limits/&quot;&gt;Workflows limits&lt;/a&gt; for more information.&lt;/p&gt;</description><pubDate>Tue, 03 Mar 2026 12:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Agents - Real-time file watching in Sandboxes</title><link>https://developers.cloudflare.com/changelog/post/2026-03-03-sandbox-watch-file-events/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-03-sandbox-watch-file-events/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt; now support real-time filesystem watching via &lt;code&gt;sandbox.watch()&lt;/code&gt;. The method returns a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Server-Sent Events&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; stream backed by native inotify, so your Worker receives &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;modify&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, and &lt;code&gt;move&lt;/code&gt; events as they happen inside the container.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;sandboxwatchpath-options&quot;&gt;&lt;code&gt;sandbox.watch(path, options)&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#sandboxwatchpath-options&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Pass a directory path and optional filters. The returned stream is a standard &lt;code&gt;ReadableStream&lt;/code&gt; you can proxy directly to a browser client or consume server-side.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Stream events to a browser client&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;/workspace/src&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	recursive: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	include: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;*.ts&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;*.js&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(stream, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	headers: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text/event-stream&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Stream events to a browser client&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;/workspace/src&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	recursive: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	include: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;*.ts&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;*.js&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(stream, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	headers: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text/event-stream&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;server-side-consumption-with-parsessestream&quot;&gt;Server-side consumption with &lt;code&gt;parseSSEStream&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#server-side-consumption-with-parsessestream&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Use &lt;code&gt;parseSSEStream&lt;/code&gt; to iterate over events inside a Worker without forwarding them to a client.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { parseSSEStream } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;/workspace/src&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { recursive: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; event&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; of&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; parseSSEStream&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(stream)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(event.type, event.path);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { parseSSEStream } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { FileWatchSSEEvent } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;watch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;/workspace/src&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { recursive: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; event&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; of&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; parseSSEStream&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;FileWatchSSEEvent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;(stream)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(event.type, event.path);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Each event includes a &lt;code&gt;type&lt;/code&gt; field (&lt;code&gt;create&lt;/code&gt;, &lt;code&gt;modify&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, or &lt;code&gt;move&lt;/code&gt;) and the affected &lt;code&gt;path&lt;/code&gt;. Move events also include a &lt;code&gt;from&lt;/code&gt; field with the original path.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;options&quot;&gt;Options&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#options&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;recursive&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Watch subdirectories. Defaults to &lt;code&gt;false&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;include&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string[]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Glob patterns to filter events. Omit to receive all events.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/sandbox@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For full API details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/api/file-watching/&quot;&gt;Sandbox file watching reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category></item><item><title>Radar - Network Quality Test on Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-03-03-radar-network-quality-test/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-03-radar-network-quality-test/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; now includes a &lt;a href=&quot;https://radar.cloudflare.com/speedtest&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Network Quality Test&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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 &lt;a href=&quot;https://speed.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;speed.cloudflare.com&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2294,height=1526,format=webp/_astro/network-quality-test.BwQ-CoTH.png&quot; alt=&quot;Screenshot of the Network Quality Test page on Radar&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2294&quot; height=&quot;1526&quot;&gt;</description><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Agents, Workers - Agents SDK v0.7.0: Observability rewrite, keepAlive, and waitForMcpConnections</title><link>https://developers.cloudflare.com/changelog/post/2026-03-02-agents-sdk-v0.7.0/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-02-agents-sdk-v0.7.0/</guid><description>
&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; rewrites observability from scratch with &lt;code&gt;diagnostics_channel&lt;/code&gt;, adds &lt;code&gt;keepAlive()&lt;/code&gt; to prevent Durable Object eviction during long-running work, and introduces &lt;code&gt;waitForMcpConnections&lt;/code&gt; so MCP tools are always available when &lt;code&gt;onChatMessage&lt;/code&gt; runs.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;observability-rewrite&quot;&gt;Observability rewrite&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#observability-rewrite&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The previous observability system used &lt;code&gt;console.log()&lt;/code&gt; with a custom &lt;code&gt;Observability.emit()&lt;/code&gt; interface. v0.7.0 replaces it with structured events published to &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/nodejs/diagnostics-channel/&quot;&gt;diagnostics channels&lt;/a&gt; — silent by default, zero overhead when nobody is listening.&lt;/p&gt;
&lt;p&gt;Every event has a &lt;code&gt;type&lt;/code&gt;, &lt;code&gt;payload&lt;/code&gt;, and &lt;code&gt;timestamp&lt;/code&gt;. Events are routed to seven named channels:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Channel&lt;/th&gt;
&lt;th&gt;Event types&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agents:state&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;state:update&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agents:rpc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rpc&lt;/code&gt;, &lt;code&gt;rpc:error&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agents:message&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;message:request&lt;/code&gt;, &lt;code&gt;message:response&lt;/code&gt;, &lt;code&gt;message:clear&lt;/code&gt;, &lt;code&gt;message:cancel&lt;/code&gt;, &lt;code&gt;message:error&lt;/code&gt;, &lt;code&gt;tool:result&lt;/code&gt;, &lt;code&gt;tool:approval&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agents:schedule&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;schedule:create&lt;/code&gt;, &lt;code&gt;schedule:execute&lt;/code&gt;, &lt;code&gt;schedule:cancel&lt;/code&gt;, &lt;code&gt;schedule:retry&lt;/code&gt;, &lt;code&gt;schedule:error&lt;/code&gt;, &lt;code&gt;queue:retry&lt;/code&gt;, &lt;code&gt;queue:error&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agents:lifecycle&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;destroy&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agents:workflow&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;workflow:start&lt;/code&gt;, &lt;code&gt;workflow:event&lt;/code&gt;, &lt;code&gt;workflow:approved&lt;/code&gt;, &lt;code&gt;workflow:rejected&lt;/code&gt;, &lt;code&gt;workflow:terminated&lt;/code&gt;, &lt;code&gt;workflow:paused&lt;/code&gt;, &lt;code&gt;workflow:resumed&lt;/code&gt;, &lt;code&gt;workflow:restarted&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agents:mcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mcp:client:preconnect&lt;/code&gt;, &lt;code&gt;mcp:client:connect&lt;/code&gt;, &lt;code&gt;mcp:client:authorize&lt;/code&gt;, &lt;code&gt;mcp:client:discover&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Use the typed &lt;code&gt;subscribe()&lt;/code&gt; helper from &lt;code&gt;agents/observability&lt;/code&gt; for type-safe access:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { subscribe } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/observability&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; unsub&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; subscribe&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;rpc&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (event.type &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;rpc&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`RPC call: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (event.type &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;rpc:error&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			`RPC failed: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} — ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Clean up when done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;unsub&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { subscribe } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/observability&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; unsub&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; subscribe&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;rpc&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (event.type &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;rpc&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`RPC call: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (event.type &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;rpc:error&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;			`RPC failed: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} — ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Clean up when done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;unsub&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;In production, all diagnostics channel messages are automatically forwarded to &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/logs/tail-workers/&quot;&gt;Tail Workers&lt;/a&gt; — no subscription code needed in the agent itself:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; tail&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;events&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		for&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; event&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; of&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; events) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			for&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; msg&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; of&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; event.diagnosticsChannelEvents) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;				// msg.channel is &quot;agents:rpc&quot;, &quot;agents:workflow&quot;, etc.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(msg.timestamp, msg.channel, msg.message);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; tail&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;events&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		for&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; event&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; of&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; events) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			for&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; msg&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; of&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; event.diagnosticsChannelEvents) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;				// msg.channel is &quot;agents:rpc&quot;, &quot;agents:workflow&quot;, etc.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(msg.timestamp, msg.channel, msg.message);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The custom &lt;code&gt;Observability&lt;/code&gt; override interface is still supported for users who need to filter or forward events to external services.&lt;/p&gt;
&lt;p&gt;For the full event reference, refer to the &lt;a href=&quot;https://developers.cloudflare.com/agents/runtime/operations/observability/diagnostics-channels/&quot;&gt;Diagnostics channels documentation&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;keepalive-and-keepalivewhile&quot;&gt;&lt;code&gt;keepAlive()&lt;/code&gt; and &lt;code&gt;keepAliveWhile()&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#keepalive-and-keepalivewhile&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;keepAlive()&lt;/code&gt; 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.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; dispose&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;keepAlive&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; longRunningComputation&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; sendResults&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(result);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;finally&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	dispose&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; dispose&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;keepAlive&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; longRunningComputation&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; sendResults&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(result);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;finally&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	dispose&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;keepAliveWhile()&lt;/code&gt; wraps an async function with automatic cleanup — the heartbeat starts before the function runs and stops when it completes:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;keepAliveWhile&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; longRunningComputation&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; data;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;keepAliveWhile&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; longRunningComputation&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; data;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Key details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multiple concurrent callers&lt;/strong&gt; — Each &lt;code&gt;keepAlive()&lt;/code&gt; call returns an independent disposer. Disposing one does not affect others.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AIChatAgent built-in&lt;/strong&gt; — &lt;code&gt;AIChatAgent&lt;/code&gt; automatically calls &lt;code&gt;keepAlive()&lt;/code&gt; during streaming responses. You do not need to add it yourself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Uses the scheduling system&lt;/strong&gt; — The heartbeat does not conflict with your own schedules. It shows up in &lt;code&gt;getSchedules()&lt;/code&gt; if you need to inspect it.&lt;/li&gt;
&lt;/ul&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;&lt;code&gt;keepAlive()&lt;/code&gt; is marked &lt;code&gt;@experimental&lt;/code&gt; and may change between releases.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;For the full API reference and when-to-use guidance, refer to &lt;a href=&quot;https://developers.cloudflare.com/agents/runtime/execution/schedule-tasks/#keeping-the-agent-alive&quot;&gt;Schedule tasks — Keeping the agent alive&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;waitformcpconnections&quot;&gt;&lt;code&gt;waitForMcpConnections&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#waitformcpconnections&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;AIChatAgent&lt;/code&gt; now waits for MCP server connections to settle before calling &lt;code&gt;onChatMessage&lt;/code&gt;. This ensures &lt;code&gt;this.mcp.getAITools()&lt;/code&gt; returns the full set of tools, especially after Durable Object hibernation when connections are being restored in the background.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ChatAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AIChatAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Default — waits up to 10 seconds&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// waitForMcpConnections = { timeout: 10_000 };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Wait forever&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	waitForMcpConnections&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Disable waiting&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	waitForMcpConnections&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ChatAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AIChatAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Default — waits up to 10 seconds&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// waitForMcpConnections = { timeout: 10_000 };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Wait forever&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	waitForMcpConnections&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Disable waiting&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	waitForMcpConnections&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{ timeout: 10_000 }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wait up to 10 seconds (default)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{ timeout: N }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wait up to &lt;code&gt;N&lt;/code&gt; milliseconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wait indefinitely until all connections ready&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Do not wait (old behavior before 0.2.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;For lower-level control, call &lt;code&gt;this.mcp.waitForConnections()&lt;/code&gt; directly inside &lt;code&gt;onChatMessage&lt;/code&gt; instead.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;other-improvements&quot;&gt;Other improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#other-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MCP deduplication by name and URL&lt;/strong&gt; — &lt;code&gt;addMcpServer&lt;/code&gt; 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).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;callbackHost&lt;/code&gt; optional for non-OAuth servers&lt;/strong&gt; — &lt;code&gt;addMcpServer&lt;/code&gt; no longer requires &lt;code&gt;callbackHost&lt;/code&gt; when connecting to MCP servers that do not use OAuth.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP URL security&lt;/strong&gt; — Server URLs are validated before connection to prevent SSRF. Private IP ranges, loopback addresses, link-local addresses, and cloud metadata endpoints are blocked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom denial messages&lt;/strong&gt; — &lt;code&gt;addToolOutput&lt;/code&gt; now supports &lt;code&gt;state: &quot;output-error&quot;&lt;/code&gt; with &lt;code&gt;errorText&lt;/code&gt; for custom denial messages in human-in-the-loop tool approval flows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;requestId&lt;/code&gt; in chat options&lt;/strong&gt; — &lt;code&gt;onChatMessage&lt;/code&gt; options now include a &lt;code&gt;requestId&lt;/code&gt; for logging and correlating events.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; agents@latest&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/ai-chat@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>AI Gateway - Get started with AI Gateway automatically</title><link>https://developers.cloudflare.com/changelog/post/2026-03-02-default-gateway/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-02-default-gateway/</guid><description>&lt;p&gt;You can now start using AI Gateway with a single API call — no setup required. Use &lt;code&gt;default&lt;/code&gt; as your gateway ID, and AI Gateway creates one for you automatically on the first request.&lt;/p&gt;
&lt;p&gt;To try it out, &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/get-started/create-token/&quot;&gt;create an API token&lt;/a&gt; with &lt;code&gt;AI Gateway - Read&lt;/code&gt;, &lt;code&gt;AI Gateway - Edit&lt;/code&gt;, and &lt;code&gt;Workers AI - Read&lt;/code&gt; permissions, then run:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://gateway.ai.cloudflare.com/v1/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/default/compat/chat/completions&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cf-aig-authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: application/json&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;model&quot;: &quot;workers-ai/@cf/meta/llama-3.3-70b-instruct-fp8-fast&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;messages&quot;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;role&quot;: &quot;user&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;content&quot;: &quot;What is Cloudflare?&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;AI Gateway gives you logging, caching, rate limiting, and access to multiple AI providers through a single endpoint. For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/get-started/&quot;&gt;Get started&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category></item><item><title>Cloudflare One - Copy Cloudflare One resources as JSON or POST requests</title><link>https://developers.cloudflare.com/changelog/post/2026-03-copy-resources-as-json-or-post-requests/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-copy-resources-as-json-or-post-requests/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To use this feature, click the overflow menu (⋮) on any supported resource and select &lt;strong&gt;Copy as JSON&lt;/strong&gt; or &lt;strong&gt;Copy as POST request&lt;/strong&gt;. The copied output includes only the fields present on your resource, giving you a clean and minimal starting point for your own API calls.&lt;/p&gt;
&lt;p&gt;Initially supported resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Access applications&lt;/li&gt;
&lt;li&gt;Access policies&lt;/li&gt;
&lt;li&gt;Gateway policies&lt;/li&gt;
&lt;li&gt;Resolver policies&lt;/li&gt;
&lt;li&gt;Service tokens&lt;/li&gt;
&lt;li&gt;Identity providers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We will continue to add support for more resources throughout 2026.&lt;/p&gt;</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category></item><item><title>WAF - WAF Release - 2026-03-02</title><link>https://developers.cloudflare.com/changelog/post/2026-03-02-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-02-waf-release/</guid><description>
&lt;p&gt;This week&apos;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;0f282f3c89614779966faf52966ec6b1&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...966ec6b1&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SmarterMail - Arbitrary File Upload - CVE-2025-52691&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;35978af68e374a059e397bf5ee964a8c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ee964a8c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SmarterMail - Authentication Bypass - CVE-2026-23760&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;4bb099bcd71141d4a35c1aa675b64d99&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...75b64d99&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Command Injection - Nslookup - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule is merged into the original rule &quot;Command Injection - Nslookup&quot; (ID: &lt;rule-id id=&quot;f4a310393c564d50bd585601b090ba9a&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...b090ba9a&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 02 Mar 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Access - Clipboard controls for browser-based RDP</title><link>https://developers.cloudflare.com/changelog/post/2026-03-01-rdp-clipboard-controls/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-03-01-rdp-clipboard-controls/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2000,height=546,format=webp/_astro/rdp-clipboard-controls.B0ZmliDb.png&quot; alt=&quot;Enable users to copy and paste content from their local machine to remote RDP sessions in the Cloudflare One dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2000&quot; height=&quot;546&quot;&gt;
&lt;p&gt;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&apos;s personal device.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;configuration-options&quot;&gt;Configuration options&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#configuration-options&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Clipboard controls are configured per policy within your Access application. For each policy, you can independently allow or deny:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Copy from local client to remote RDP session&lt;/strong&gt; — Users can copy/paste text from their local machine into the browser-based RDP session.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copy from remote RDP session to local client&lt;/strong&gt; — Users can copy/paste text from the browser-based RDP session to their local machine.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/rdp/rdp-browser/#clipboard-controls&quot;&gt;Clipboard controls for browser-based RDP&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Access - Export MCP server portal logs with Logpush</title><link>https://developers.cloudflare.com/changelog/post/2026-02-27-mcp-portal-logpush/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-27-mcp-portal-logpush/</guid><description>&lt;aside role=&quot;note&quot; aria-label=&quot;Availability&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Availability&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;Only available on Enterprise plans.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/ai-controls/mcp-portals/&quot;&gt;MCP server portals&lt;/a&gt; now supports &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/&quot;&gt;Logpush&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;available-log-fields&quot;&gt;Available log fields&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#available-log-fields&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The MCP server portal logs dataset includes fields such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Datetime&lt;/code&gt; — Timestamp of the request&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PortalID&lt;/code&gt; / &lt;code&gt;PortalAUD&lt;/code&gt; — Portal identifiers&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ServerID&lt;/code&gt; / &lt;code&gt;ServerURL&lt;/code&gt; — Upstream MCP server details&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Method&lt;/code&gt; — JSON-RPC method (for example, &lt;code&gt;tools/call&lt;/code&gt;, &lt;code&gt;prompts/get&lt;/code&gt;, &lt;code&gt;resources/read&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ToolCallName&lt;/code&gt; / &lt;code&gt;PromptGetName&lt;/code&gt; / &lt;code&gt;ResourceReadURI&lt;/code&gt; — Method-specific identifiers&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UserID&lt;/code&gt; / &lt;code&gt;UserEmail&lt;/code&gt; — Authenticated user information&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Success&lt;/code&gt; / &lt;code&gt;Error&lt;/code&gt; — Request outcome&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ServerResponseDurationMs&lt;/code&gt; — Response time from upstream server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the complete field reference, refer to &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/mcp_portal_logs/&quot;&gt;MCP portal logs&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;set-up-logpush&quot;&gt;Set up Logpush&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#set-up-logpush&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To configure Logpush for MCP server portal logs, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/logs/logpush/&quot;&gt;Logpush integration&lt;/a&gt;.&lt;/p&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;MCP server portals is currently in beta.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;</description><pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Gateway - New protocols added for Gateway Protocol Detection (Beta)</title><link>https://developers.cloudflare.com/changelog/post/2026-02-27-new-protocol-detection-protocols/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-27-new-protocol-detection-protocols/</guid><description>&lt;p&gt;Gateway &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/protocol-detection/&quot;&gt;Protocol Detection&lt;/a&gt; now supports seven additional protocols in beta:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IMAP&lt;/td&gt;
&lt;td&gt;Internet Message Access Protocol — email retrieval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;POP3&lt;/td&gt;
&lt;td&gt;Post Office Protocol v3 — email retrieval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMTP&lt;/td&gt;
&lt;td&gt;Simple Mail Transfer Protocol — email sending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MYSQL&lt;/td&gt;
&lt;td&gt;MySQL database wire protocol&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSYNC-DAEMON&lt;/td&gt;
&lt;td&gt;rsync daemon protocol&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LDAP&lt;/td&gt;
&lt;td&gt;Lightweight Directory Access Protocol&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NTP&lt;/td&gt;
&lt;td&gt;Network Time Protocol&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;These protocols join the existing set of detected protocols (HTTP, HTTP2, SSH, TLS, DCERPC, MQTT, and TPKT) and can be used with the &lt;em&gt;Detected Protocol&lt;/em&gt; selector in &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/&quot;&gt;Network policies&lt;/a&gt; to identify and filter traffic based on the application-layer protocol, without relying on port-based identification.&lt;/p&gt;
&lt;p&gt;If protocol detection is enabled on your account, these protocols will automatically be logged when detected in your Gateway network traffic.&lt;/p&gt;
&lt;p&gt;For more information on using Protocol Detection, refer to the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/network-policies/protocol-detection/&quot;&gt;Protocol detection documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category></item><item><title>Radar - Post-Quantum Encryption and Key Transparency on Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-02-27-radar-pq-key-transparency/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-27-radar-pq-key-transparency/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;post-quantum-origin-support&quot;&gt;Post-quantum origin support&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#post-quantum-origin-support&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The new &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/post_quantum/&quot;&gt;&lt;code&gt;Post-Quantum&lt;/code&gt;&lt;/a&gt; API provides the following endpoints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/post_quantum/subresources/tls/methods/support/&quot;&gt;&lt;code&gt;/post_quantum/tls/support&lt;/code&gt;&lt;/a&gt; - Tests whether a host supports post-quantum TLS key exchange.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/post_quantum/methods/summary/&quot;&gt;&lt;code&gt;/post_quantum/origin/summary/{dimension}&lt;/code&gt;&lt;/a&gt; - Returns origin post-quantum data summarized by key agreement algorithm.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/post_quantum/methods/timeseries_groups/&quot;&gt;&lt;code&gt;/post_quantum/origin/timeseries_groups/{dimension}&lt;/code&gt;&lt;/a&gt; - Returns origin post-quantum timeseries data grouped by key agreement algorithm.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The new &lt;a href=&quot;https://radar.cloudflare.com/post-quantum&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Post-Quantum Encryption&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; page shows the share of customer origins supporting &lt;a href=&quot;https://developers.cloudflare.com/ssl/post-quantum-cryptography/pqc-support/#x25519mlkem768&quot;&gt;X25519MLKEM768&lt;/a&gt;, derived from daily automated TLS scans of TLS 1.3-compatible origins. The scanner tests for algorithm support rather than the origin server&apos;s configured preference.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1040,format=webp/_astro/pq-origin-support.Bn5Dw_It.png&quot; alt=&quot;Screenshot of the origin post-quantum support graph on Radar&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;1040&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2372,height=566,format=webp/_astro/pq-host-test.dRqwoOvo.png&quot; alt=&quot;Screenshot of the post-quantum host test tool on Radar&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2372&quot; height=&quot;566&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-transparency&quot;&gt;Key Transparency&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-transparency&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A new &lt;a href=&quot;https://radar.cloudflare.com/key-transparency&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Key Transparency&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/key-transparency/api/&quot;&gt;Key Transparency Auditor API&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2454,height=1062,format=webp/_astro/key-transparency-dashboard.DNQgLsb0.png&quot; alt=&quot;Screenshot of the Key Transparency dashboard on Radar&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2454&quot; height=&quot;1062&quot;&gt;
&lt;p&gt;Learn more about these features in our &lt;a href=&quot;https://blog.cloudflare.com/radar-origin-pq-key-transparency-aspa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;blog post&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and check out the &lt;a href=&quot;https://radar.cloudflare.com/post-quantum&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Post-Quantum Encryption&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://radar.cloudflare.com/key-transparency&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Key Transparency&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; pages to explore the data.&lt;/p&gt;</description><pubDate>Fri, 27 Feb 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Cache - Asynchronous stale-while-revalidate</title><link>https://developers.cloudflare.com/changelog/post/2026-02-26-async-stale-while-revalidate/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-26-async-stale-while-revalidate/</guid><description>&lt;p&gt;Cloudflare&apos;s &lt;a href=&quot;https://developers.cloudflare.com/cache/concepts/cache-control/#revalidation&quot;&gt;&lt;code&gt;stale-while-revalidate&lt;/code&gt;&lt;/a&gt; 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 &lt;code&gt;UPDATING&lt;/code&gt; status until the origin responds, after which subsequent requests receive fresh content with a &lt;code&gt;HIT&lt;/code&gt; status.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;stale-while-revalidate&lt;/code&gt; is a &lt;code&gt;Cache-Control&lt;/code&gt; directive set by your origin server that allows Cloudflare to serve an expired cached asset while a fresh copy is fetched from the origin.&lt;/p&gt;
&lt;p&gt;Asynchronous revalidation brings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lower latency&lt;/strong&gt;: No visitor is waiting for the origin when the asset is already in cache. Every request is served from cache during revalidation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consistent experience&lt;/strong&gt;: All visitors receive the same cached response during revalidation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduced error exposure&lt;/strong&gt;: The first request is no longer vulnerable to origin timeouts or errors. All visitors receive a cached response while revalidation happens in the background.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;availability&quot;&gt;Availability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#availability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To use this feature, make sure your origin includes the &lt;code&gt;stale-while-revalidate&lt;/code&gt; directive in the &lt;code&gt;Cache-Control&lt;/code&gt; header. Refer to the &lt;a href=&quot;https://developers.cloudflare.com/cache/concepts/cache-control/#revalidation&quot;&gt;Cache-Control documentation&lt;/a&gt; for details.&lt;/p&gt;</description><pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate><product>Cache</product><category>Cache</category></item><item><title>Cloudflare Fundamentals - Markdown responses for Cloudflare 1xxx errors</title><link>https://developers.cloudflare.com/changelog/post/2026-02-26-markdown-responses-for-1xxx-errors/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-26-markdown-responses-for-1xxx-errors/</guid><description>&lt;p&gt;Cloudflare now returns structured Markdown responses for Cloudflare-generated 1xxx errors when clients send &lt;code&gt;Accept: text/markdown&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Each response includes YAML frontmatter plus guidance sections (&lt;code&gt;What happened&lt;/code&gt; / &lt;code&gt;What you should do&lt;/code&gt;) so agents can make deterministic retry and escalation decisions without parsing HTML.&lt;/p&gt;
&lt;p&gt;In measured 1,015 comparisons, Markdown reduced payload size and token footprint by over 98% versus HTML.&lt;/p&gt;
&lt;p&gt;Included frontmatter fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;error_code&lt;/code&gt;, &lt;code&gt;error_name&lt;/code&gt;, &lt;code&gt;error_category&lt;/code&gt;, &lt;code&gt;http_status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ray_id&lt;/code&gt;, &lt;code&gt;timestamp&lt;/code&gt;, &lt;code&gt;zone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cloudflare_error&lt;/code&gt;, &lt;code&gt;retryable&lt;/code&gt;, &lt;code&gt;retry_after&lt;/code&gt; (when applicable), &lt;code&gt;owner_action_required&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Default behavior is unchanged: clients that do not explicitly request Markdown continue to receive HTML error pages.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;negotiation-behavior&quot;&gt;Negotiation behavior&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#negotiation-behavior&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Cloudflare uses standard HTTP content negotiation on the &lt;code&gt;Accept&lt;/code&gt; header.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Accept: text/markdown&lt;/code&gt; -&amp;gt; Markdown&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Accept: text/markdown, text/html;q=0.9&lt;/code&gt; -&amp;gt; Markdown&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Accept: text/*&lt;/code&gt; -&amp;gt; Markdown&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Accept: */*&lt;/code&gt; -&amp;gt; HTML (default browser behavior)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When multiple values are present, Cloudflare selects the highest-priority supported media type using &lt;code&gt;q&lt;/code&gt; values. If Markdown is not explicitly preferred, HTML is returned.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;availability&quot;&gt;Availability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#availability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Available now for Cloudflare-generated 1xxx errors.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Accept: text/markdown&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;your-domai&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/cdn-cgi/error/1015&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https://developers.cloudflare.com/support/troubleshooting/http-status-codes/cloudflare-1xxx-errors/&quot;&gt;Cloudflare 1xxx error documentation&lt;/a&gt;&lt;/p&gt;</description><pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Agents, Workers - Agents SDK v0.6.0: RPC transport for MCP, optional OAuth, hardened schema conversion, and @cloudflare/ai-chat fixes</title><link>https://developers.cloudflare.com/changelog/post/2026-02-25-agents-sdk-v0.6.0/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-25-agents-sdk-v0.6.0/</guid><description>
&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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 &lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; reliability fixes.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;rpc-transport-for-mcp&quot;&gt;RPC transport for MCP&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#rpc-transport-for-mcp&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Pass the Durable Object namespace directly to &lt;code&gt;addMcpServer&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Agent } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onStart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Connect via DO binding — no HTTP, no network overhead&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;addMcpServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;counter&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_MCP&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// With props for per-user context&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;addMcpServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;counter&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_MCP&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			props: { userId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;admin&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Agent } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onStart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Connect via DO binding — no HTTP, no network overhead&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;addMcpServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;counter&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_MCP&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// With props for per-user context&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;addMcpServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;counter&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;MY_MCP&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			props: { userId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user-123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;admin&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;addMcpServer&lt;/code&gt; method now accepts &lt;code&gt;string | DurableObjectNamespace&lt;/code&gt; as the second parameter with full TypeScript overloads, so HTTP and RPC paths are type-safe and cannot be mixed.&lt;/p&gt;
&lt;p&gt;Key capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hibernation support&lt;/strong&gt; — 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deduplication&lt;/strong&gt; — Calling &lt;code&gt;addMcpServer&lt;/code&gt; with the same server name returns the existing connection instead of creating duplicates. Connection IDs are stable across hibernation restore.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smaller surface area&lt;/strong&gt; — The RPC transport internals have been rewritten and reduced from 609 lines to 245 lines. &lt;code&gt;RPCServerTransport&lt;/code&gt; now uses &lt;code&gt;JSONRPCMessageSchema&lt;/code&gt; from the MCP SDK for validation instead of hand-written checks.&lt;/li&gt;
&lt;/ul&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;RPC transport is experimental. The API may change based on feedback. Refer to &lt;a href=&quot;https://github.com/cloudflare/agents/issues/565&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;the tracking issue&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; for updates.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;optional-oauth-for-mcp-connections&quot;&gt;Optional OAuth for MCP connections&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#optional-oauth-for-mcp-connections&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;addMcpServer()&lt;/code&gt; no longer eagerly creates an OAuth provider for every connection. For servers that do not require authentication, a simple call is all you need:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// No callbackHost, no OAuth config — just works&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;addMcpServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://mcp.example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// No callbackHost, no OAuth config — just works&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;addMcpServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://mcp.example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If the server responds with a 401, the SDK throws a clear error: &lt;code&gt;&quot;This MCP server requires OAuth authentication. Provide callbackHost in addMcpServer options to enable the OAuth flow.&quot;&lt;/code&gt; The restore-from-storage flow also handles missing callback URLs gracefully, skipping auth provider creation for non-OAuth servers.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;hardened-json-schema-to-typescript-converter&quot;&gt;Hardened JSON Schema to TypeScript converter&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#hardened-json-schema-to-typescript-converter&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The schema converter used by &lt;code&gt;generateTypes()&lt;/code&gt; and &lt;code&gt;getAITools()&lt;/code&gt; now handles edge cases that previously caused crashes in production:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Depth and circular reference guards&lt;/strong&gt; — Prevents stack overflows on recursive or deeply nested schemas&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;$ref&lt;/code&gt; resolution&lt;/strong&gt; — Supports internal JSON Pointers (&lt;code&gt;#/definitions/...&lt;/code&gt;, &lt;code&gt;#/$defs/...&lt;/code&gt;, &lt;code&gt;#&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tuple support&lt;/strong&gt; — &lt;code&gt;prefixItems&lt;/code&gt; (JSON Schema 2020-12) and array &lt;code&gt;items&lt;/code&gt; (draft-07)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenAPI 3.0 &lt;code&gt;nullable: true&lt;/code&gt;&lt;/strong&gt; — Supported across all schema branches&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Per-tool error isolation&lt;/strong&gt; — One malformed schema cannot crash the full pipeline in &lt;code&gt;generateTypes()&lt;/code&gt; or &lt;code&gt;getAITools()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Missing &lt;code&gt;inputSchema&lt;/code&gt; fallback&lt;/strong&gt; — &lt;code&gt;getAITools()&lt;/code&gt; falls back to &lt;code&gt;{ type: &quot;object&quot; }&lt;/code&gt; instead of throwing&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cloudflareai-chat-fixes&quot;&gt;&lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cloudflareai-chat-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tool denial flow&lt;/strong&gt; — Denied tool approvals (&lt;code&gt;approved: false&lt;/code&gt;) now transition to &lt;code&gt;output-denied&lt;/code&gt; with a &lt;code&gt;tool_result&lt;/code&gt;, fixing Anthropic provider compatibility. Custom denial messages are supported via &lt;code&gt;state: &quot;output-error&quot;&lt;/code&gt; and &lt;code&gt;errorText&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Abort/cancel support&lt;/strong&gt; — Streaming responses now properly cancel the reader loop when the abort signal fires and send a done signal to the client.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duplicate message persistence&lt;/strong&gt; — &lt;code&gt;persistMessages()&lt;/code&gt; now reconciles assistant messages by content and order, preventing duplicate rows when clients resend full history.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;requestId&lt;/code&gt; in &lt;code&gt;OnChatMessageOptions&lt;/code&gt;&lt;/strong&gt; — Handlers can now send properly-tagged error responses for pre-stream failures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;redacted_thinking&lt;/code&gt; preservation&lt;/strong&gt; — The message sanitizer no longer strips Anthropic &lt;code&gt;redacted_thinking&lt;/code&gt; blocks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;/get-messages&lt;/code&gt; reliability&lt;/strong&gt; — Endpoint handling moved from a prototype &lt;code&gt;onRequest()&lt;/code&gt; override to a constructor wrapper, so it works even when users override &lt;code&gt;onRequest&lt;/code&gt; without calling &lt;code&gt;super.onRequest()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Client tool APIs undeprecated&lt;/strong&gt; — &lt;code&gt;createToolsFromClientSchemas&lt;/code&gt;, &lt;code&gt;clientTools&lt;/code&gt;, &lt;code&gt;AITool&lt;/code&gt;, &lt;code&gt;extractClientToolSchemas&lt;/code&gt;, and the &lt;code&gt;tools&lt;/code&gt; option on &lt;code&gt;useAgentChat&lt;/code&gt; are restored for SDK use cases where tools are defined dynamically at runtime.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;jsonSchema&lt;/code&gt; initialization&lt;/strong&gt; — Fixed &lt;code&gt;jsonSchema not initialized&lt;/code&gt; error when calling &lt;code&gt;getAITools()&lt;/code&gt; in &lt;code&gt;onChatMessage&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; agents@latest&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/ai-chat@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Containers - Run 15x more Containers with higher resource limits</title><link>https://developers.cloudflare.com/changelog/post/2026-02-25-higher-container-resource-limits/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-25-higher-container-resource-limits/</guid><description>&lt;p&gt;You can now run more &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt; concurrently with significantly higher limits on memory, vCPU, and disk.&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;th&gt;Previous Limit&lt;/th&gt;
&lt;th&gt;New Limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Memory for concurrent live Container instances&lt;/td&gt;
&lt;td&gt;400GiB&lt;/td&gt;
&lt;td&gt;6TiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vCPU for concurrent live Container instances&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;1,500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk for concurrent live Container instances&lt;/td&gt;
&lt;td&gt;2TB&lt;/td&gt;
&lt;td&gt;30TB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;This 15x increase enables larger-scale workloads on Containers. You can now run 15,000 instances of the &lt;code&gt;lite&lt;/code&gt; instance type, 6,000 instances of &lt;code&gt;basic&lt;/code&gt;, over 1,500 instances of &lt;code&gt;standard-1&lt;/code&gt;, or over 1,000 instances of &lt;code&gt;standard-2&lt;/code&gt; concurrently.&lt;/p&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/limits/&quot;&gt;Limits&lt;/a&gt; for more details on the available instance types and limits.&lt;/p&gt;</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Radar - RPKI ASPA Deployment Insights on Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-02-25-radar-aspa-insights/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-25-radar-aspa-insights/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; now includes &lt;a href=&quot;https://datatracker.ietf.org/doc/draft-ietf-sidrops-aspa-verification/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Autonomous System Provider Authorization (ASPA)&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; deployment insights, providing visibility into the adoption and verification of ASPA objects across the global routing ecosystem.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-api-endpoints&quot;&gt;New API endpoints&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-api-endpoints&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The new &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/rpki/subresources/aspa/&quot;&gt;&lt;code&gt;ASPA&lt;/code&gt;&lt;/a&gt; API provides the following endpoints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/rpki/subresources/aspa/methods/snapshot/&quot;&gt;&lt;code&gt;/bgp/rpki/aspa/snapshot&lt;/code&gt;&lt;/a&gt; - Retrieves current or historical ASPA objects.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/rpki/subresources/aspa/methods/changes/&quot;&gt;&lt;code&gt;/bgp/rpki/aspa/changes&lt;/code&gt;&lt;/a&gt; - Retrieves changes to ASPA objects over time.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/bgp/subresources/rpki/subresources/aspa/methods/timeseries/&quot;&gt;&lt;code&gt;/bgp/rpki/aspa/timeseries&lt;/code&gt;&lt;/a&gt; - Retrieves ASPA object counts over time as a timeseries.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-radar-widgets&quot;&gt;New Radar widgets&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-radar-widgets&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://radar.cloudflare.com/routing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;global routing page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; now shows the ASPA deployment trend over time by counting daily ASPA objects.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=876,format=webp/_astro/aspa-global-trend.CXGWGFL4.png&quot; alt=&quot;Screenshot of the ASPA deployment trend chart&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;876&quot;&gt;
&lt;p&gt;The global routing page also displays the most recent ASPA objects, searchable by ASN or AS name.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=1852,format=webp/_astro/aspa-global-table.vHUyNoTh.png&quot; alt=&quot;Screenshot of the ASPA objects table&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;1852&quot;&gt;
&lt;p&gt;On country and region routing pages, a new widget shows the ASPA deployment rate for ASNs registered in the selected country or region.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=876,format=webp/_astro/aspa-germany-trend.DIH6CESC.png&quot; alt=&quot;Screenshot of the ASPA deployment trent chart for Germany&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;876&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2198,height=1212,format=webp/_astro/aspa-asn-timeline.Bnl6upJs.png&quot; alt=&quot;Screenshot of the ASPA changes timeline on an AS routing page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2198&quot; height=&quot;1212&quot;&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://radar.cloudflare.com/routing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Radar routing page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to explore the data.&lt;/p&gt;</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Workers - Better Windows support for Python Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-02-13-pywrangler-windows-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-13-pywrangler-windows-support/</guid><description>&lt;p&gt;&lt;a href=&quot;https://github.com/cloudflare/workers-py?tab=readme-ov-file#pywrangler&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Pywrangler&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;You can install and use Pywrangler on Windows the same way you would on other platforms.
&lt;a href=&quot;https://developers.cloudflare.com/workers/languages/python/packages/&quot;&gt;Specify your Worker&apos;s Python dependencies&lt;/a&gt; in your &lt;code&gt;pyproject.toml&lt;/code&gt; file,
then use the following commands to develop and deploy:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;uvx&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workers-py&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; pywrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;uvx&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workers-py&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; pywrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;All existing Pywrangler functionality, including package management, local development, and deployment, works on Windows without any additional configuration.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;requirements&quot;&gt;Requirements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#requirements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;This feature requires the following minimum versions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;wrangler&lt;/code&gt; &amp;gt;= 4.64.0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;workers-py&lt;/code&gt; &amp;gt;= 1.72.0&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uv&lt;/code&gt; &amp;gt;= 0.29.8&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To upgrade &lt;code&gt;workers-py&lt;/code&gt; (which includes Pywrangler) in your project, run:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;uv&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; tool&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; upgrade&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workers-py&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To upgrade &lt;code&gt;wrangler&lt;/code&gt;, run:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -g&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To upgrade &lt;code&gt;uv&lt;/code&gt;, run:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;uv&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; self&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To get started with Python Workers on Windows, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/languages/python/packages/&quot;&gt;Python packages documentation&lt;/a&gt; for full details on Pywrangler.&lt;/p&gt;</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Write structured queries to filter and search your Workers logs and traces</title><link>https://developers.cloudflare.com/changelog/post/2026-02-24-observability-query-language/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-24-observability-query-language/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/observability/&quot;&gt;Workers Observability&lt;/a&gt; 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2630,height=1302,format=webp/_astro/2026-02-24-query-language.Ol8UX7m0.png&quot; alt=&quot;Workers Observability search bar with autocomplete suggestions and Query Builder sidebar filters&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2630&quot; height=&quot;1302&quot;&gt;
&lt;p&gt;Queries written in the search bar sync with the &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/&quot;&gt;Query Builder&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;The query language supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Free text search&lt;/strong&gt; — search everywhere with a keyword like &lt;code&gt;error&lt;/code&gt;, or match an exact phrase with &lt;code&gt;&quot;exact phrase&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Field queries&lt;/strong&gt; — filter by specific fields using comparison operators (for example, &lt;code&gt;status = 500&lt;/code&gt; or &lt;code&gt;$workers.wallTimeMs &amp;gt; 100&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operators&lt;/strong&gt; — &lt;code&gt;=&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;gt;=&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;lt;=&lt;/code&gt;, and &lt;code&gt;:&lt;/code&gt; (contains)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Functions&lt;/strong&gt; — &lt;code&gt;contains(field, value)&lt;/code&gt;, &lt;code&gt;startsWith(field, prefix)&lt;/code&gt;, &lt;code&gt;regex(field, pattern)&lt;/code&gt;, and &lt;code&gt;exists(field)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boolean logic&lt;/strong&gt; — add conditions with &lt;code&gt;AND&lt;/code&gt;, &lt;code&gt;OR&lt;/code&gt;, and &lt;code&gt;NOT&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Select the help icon next to the search bar to view the full syntax reference, including all supported operators, functions, and keyboard shortcuts.&lt;/p&gt;
&lt;p&gt;Go to the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages/observability/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Workers Observability dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to try the query language.&lt;/p&gt;</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - No config? No problem. Just `wrangler deploy`</title><link>https://developers.cloudflare.com/changelog/post/2026-02-25-wrangler-autoconfig-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-25-wrangler-autoconfig-ga/</guid><description>&lt;p&gt;You can now deploy any existing project to Cloudflare Workers — even without a Wrangler configuration file — and &lt;code&gt;wrangler deploy&lt;/code&gt; will &lt;em&gt;just work&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Starting with Wrangler &lt;strong&gt;4.68.0&lt;/strong&gt;, running &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#deploy&quot;&gt;&lt;code&gt;wrangler deploy&lt;/code&gt;&lt;/a&gt; &lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/automatic-configuration/&quot;&gt;automatically configures your project&lt;/a&gt; by detecting your framework, installing required adapters, and deploying it to Cloudflare Workers.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;using-wrangler-locally&quot;&gt;Using Wrangler locally&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#using-wrangler-locally&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;When you run &lt;code&gt;wrangler deploy&lt;/code&gt; in a project without a configuration file, Wrangler:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Detects your framework from &lt;code&gt;package.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Prompts you to confirm the detected settings&lt;/li&gt;
&lt;li&gt;Installs any required adapters&lt;/li&gt;
&lt;li&gt;Generates a &lt;code&gt;wrangler.jsonc&lt;/code&gt; &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/&quot;&gt;configuration file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Deploys your project to Cloudflare Workers&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can also use &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#setup&quot;&gt;&lt;code&gt;wrangler setup&lt;/code&gt;&lt;/a&gt; to configure without deploying, or pass &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#deploy&quot;&gt;&lt;code&gt;--yes&lt;/code&gt;&lt;/a&gt; to skip prompts.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;using-the-cloudflare-dashboard&quot;&gt;Using the Cloudflare dashboard&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#using-the-cloudflare-dashboard&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1918,height=1348,format=webp/_astro/automatic-pr.CwJG6Bec.png&quot; alt=&quot;Automatic configuration pull request created by Workers Builds&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1918&quot; height=&quot;1348&quot;&gt;
&lt;p&gt;When you connect a repository through the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages/create&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Workers dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, a &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/automatic-prs/&quot;&gt;pull request is generated&lt;/a&gt; for you with all necessary files, and a &lt;a href=&quot;https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/&quot;&gt;preview deployment&lt;/a&gt; to check before merging.&lt;/p&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;A pull request is only generated when your deploy command is &lt;code&gt;npx wrangler deploy&lt;/code&gt;. If you use a custom deploy command, automatic configuration still runs but a PR is not created.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;background&quot;&gt;Background&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#background&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In December 2025, we &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-12-16-wrangler-autoconfig/&quot;&gt;introduced automatic configuration&lt;/a&gt; as an experimental feature. It is now generally available and the default behavior.&lt;/p&gt;
&lt;p&gt;If you have questions or run into issues, join the &lt;a href=&quot;https://github.com/cloudflare/workers-sdk/discussions/11667&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GitHub discussion&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare One Client - WARP client for Windows (version 2026.1.150.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-02-24-warp-windows-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-24-warp-windows-ga/</guid><description>&lt;p&gt;A new GA release for the Windows WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes, improvements, and new features.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improvements to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/windows-multiuser/&quot;&gt;multi-user mode&lt;/a&gt;. Fixed an issue where when switching from a pre-login registration to a user registration, Mobile Device Management (MDM) configuration association could be lost.&lt;/li&gt;
&lt;li&gt;Added a new feature to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#netbios-over-tcpip&quot;&gt;manage NetBIOS over TCP/IP&lt;/a&gt; functionality on the Windows client. NetBIOS over TCP/IP on the Windows client is now disabled by default and can be enabled in &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles/&quot;&gt;device profile settings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fixed an issue causing failure of the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#allow-users-to-enable-local-network-exclusion&quot;&gt;local network exclusion&lt;/a&gt; feature when configured with a timeout of &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Improvement for the Windows &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/warp-client-checks/client-certificate/&quot;&gt;client certificate posture check&lt;/a&gt; to ensure logged results are from checks that run once users log in.&lt;/li&gt;
&lt;li&gt;Improvement for more accurate reporting of device colocation information in the Cloudflare One dashboard.&lt;/li&gt;
&lt;li&gt;Fixed an issue where misconfigured DEX HTTP tests prevented new registrations.&lt;/li&gt;
&lt;li&gt;Fixed an issue causing DNS requests to fail with clients in Traffic and DNS mode.&lt;/li&gt;
&lt;li&gt;Improved service shutdown behavior in cases where the daemon is unresponsive.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd&quot;&gt;Windows 11 24H2 KB5062553&lt;/a&gt; or higher for resolution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Devices with KB5055523 installed may receive a warning about &lt;code&gt;Win32/ClickFix.ABA&lt;/code&gt; being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to &lt;a href=&quot;https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0&quot;&gt;version 1.429.19.0&lt;/a&gt; or later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS resolution may be broken when the following conditions are all true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.&lt;/li&gt;
&lt;li&gt;A custom DNS server address is configured on the primary network adapter.&lt;/li&gt;
&lt;li&gt;The custom DNS server address on the primary network adapter is changed while WARP is connected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To work around this issue, reconnect the WARP client by toggling off and back on.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 24 Feb 2026 01:15:23 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - WARP client for macOS (version 2026.1.150.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-02-24-warp-macos-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-24-warp-macos-ga/</guid><description>&lt;p&gt;A new GA release for the macOS WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes and improvements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue causing failure of the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#allow-users-to-enable-local-network-exclusion&quot;&gt;local network exclusion&lt;/a&gt; feature when configured with a timeout of &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Improvement for more accurate reporting of device colocation information in the Cloudflare One dashboard.&lt;/li&gt;
&lt;li&gt;Fixed an issue with DNS server configuration failures that caused tunnel connection delays.&lt;/li&gt;
&lt;li&gt;Fixed an issue where misconfigured DEX HTTP tests prevented new registrations.&lt;/li&gt;
&lt;li&gt;Fixed an issue causing DNS requests to fail with clients in Traffic and DNS mode.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 24 Feb 2026 01:15:22 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - WARP client for Linux (version 2026.1.150.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-02-24-warp-linux-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-24-warp-linux-ga/</guid><description>&lt;p&gt;A new GA release for the Linux WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes and improvements.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://pkg.cloudflareclient.com&quot;&gt;pkg.cloudflareclient.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue causing failure of the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#allow-users-to-enable-local-network-exclusion&quot;&gt;local network exclusion&lt;/a&gt; feature when configured with a timeout of &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Improvement for more accurate reporting of device colocation information in the Cloudflare One dashboard.&lt;/li&gt;
&lt;li&gt;Fixed an issue where misconfigured DEX HTTP tests prevented new registrations.&lt;/li&gt;
&lt;li&gt;Fixed issues causing DNS requests to fail with clients in Traffic and DNS mode or DNS only mode.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 24 Feb 2026 00:14:20 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Durable Objects, Workers - deleteAll() now deletes Durable Object alarm</title><link>https://developers.cloudflare.com/changelog/post/2026-02-24-deleteall-deletes-alarms/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-24-deleteall-deletes-alarms/</guid><description>&lt;p&gt;&lt;code&gt;deleteAll()&lt;/code&gt; now deletes a Durable Object alarm in addition to stored data for Workers with a compatibility date of &lt;code&gt;2026-02-24&lt;/code&gt; or later. This change simplifies clearing a Durable Object&apos;s storage with a single API call.&lt;/p&gt;
&lt;p&gt;Previously, &lt;code&gt;deleteAll()&lt;/code&gt; only deleted user-stored data for an object. Alarm usage stores metadata in an object&apos;s storage, which required a separate &lt;code&gt;deleteAlarm()&lt;/code&gt; call to fully clean up all storage for an object. The &lt;code&gt;deleteAll()&lt;/code&gt; change applies to both KV-backed and SQLite-backed Durable Objects.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Before: two API calls required to clear all storage&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.storage.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;deleteAlarm&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.storage.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;deleteAll&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Now: a single call clears both data and the alarm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.storage.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;deleteAll&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/sqlite-storage-api/#deleteall&quot;&gt;Storage API documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Pipelines, Workers - Dropped event metrics, typed Pipelines bindings, and improved setup</title><link>https://developers.cloudflare.com/changelog/post/2026-02-24-typed-bindings-setup-improvements-error-metrics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-24-typed-bindings-setup-improvements-error-metrics/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/pipelines/&quot;&gt;Cloudflare Pipelines&lt;/a&gt; ingests streaming data via &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Workers&lt;/a&gt; or HTTP endpoints, transforms it with SQL, and writes it to &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt; as Apache Iceberg tables. Today we&apos;re shipping three improvements to help you understand why streaming events get dropped, catch data quality issues early, and set up Pipelines faster.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;dropped-event-metrics&quot;&gt;Dropped event metrics&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#dropped-event-metrics&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When &lt;a href=&quot;https://developers.cloudflare.com/pipelines/streams/&quot;&gt;stream&lt;/a&gt; events don&apos;t match the expected schema, Pipelines accepts them during ingestion but drops them when attempting to deliver them to the &lt;a href=&quot;https://developers.cloudflare.com/pipelines/sinks/&quot;&gt;sink&lt;/a&gt;. 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3066,height=1466,format=webp/_astro/pipelines-error-log-dash.6JIa7r5d.png&quot; alt=&quot;The Errors tab in the Cloudflare dashboard showing deserialization errors grouped by type with individual error details&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3066&quot; height=&quot;1466&quot;&gt;
&lt;p&gt;Dropped events can also be queried programmatically via the new &lt;code&gt;pipelinesUserErrorsAdaptiveGroups&lt;/code&gt; GraphQL dataset. The dataset breaks down failures by specific error type (&lt;code&gt;missing_field&lt;/code&gt;, &lt;code&gt;type_mismatch&lt;/code&gt;, &lt;code&gt;parse_failure&lt;/code&gt;, or &lt;code&gt;null_value&lt;/code&gt;) so you can trace issues back to the source.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;graphql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;graphql&quot; data-nb-lang=&quot;graphql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; GetPipelineUserErrors&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	$accountTag&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	$pipelineId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	$datetimeStart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	$datetimeEnd&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;	viewer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		accounts&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;accountTag&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;$accountTag&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;			pipelinesUserErrorsAdaptiveGroups&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;				limit&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;100&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;				filter&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;					pipelineId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;$pipelineId&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;					datetime_geq&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;$datetimeStart&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;					datetime_leq&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;$datetimeEnd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;				orderBy&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;count_DESC&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;				count&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;				dimensions&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;					errorFamily&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;					errorType&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For the full list of dimensions, error types, and additional query examples, refer to &lt;a href=&quot;https://developers.cloudflare.com/pipelines/observability/metrics/#user-error-metrics&quot;&gt;User error metrics&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;typed-pipelines-bindings&quot;&gt;Typed Pipelines bindings&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#typed-pipelines-bindings&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Sending data to a Pipeline from a Worker previously used a generic &lt;code&gt;Pipeline&amp;lt;PipelineRecord&amp;gt;&lt;/code&gt; type, which meant schema mismatches (wrong field names, incorrect types) were only caught at runtime as dropped events.&lt;/p&gt;
&lt;p&gt;Running &lt;code&gt;wrangler types&lt;/code&gt; now generates schema-specific TypeScript types for your &lt;a href=&quot;https://developers.cloudflare.com/pipelines/streams/writing-to-streams/#send-via-workers&quot;&gt;Pipeline bindings&lt;/a&gt;. TypeScript catches missing required fields and incorrect field types at compile time, before your code is deployed.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;declare&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Cloudflare&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	type&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; EcommerceStreamRecord&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		user_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		event_type&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		product_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;?:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		amount&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;?:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	interface&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		STREAM&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cloudflare:pipelines&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Pipeline&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Cloudflare&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;EcommerceStreamRecord&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/pipelines/streams/writing-to-streams/#typed-pipeline-bindings&quot;&gt;Typed Pipeline bindings&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;improved-pipelines-setup&quot;&gt;Improved Pipelines setup&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#improved-pipelines-setup&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;wrangler pipelines setup&lt;/code&gt; command now offers a &lt;strong&gt;Simple&lt;/strong&gt; setup mode that applies recommended defaults and automatically creates the &lt;a href=&quot;https://developers.cloudflare.com/r2/buckets/&quot;&gt;R2 bucket&lt;/a&gt; and enables &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; if they do not already exist. Validation errors during setup prompt you to retry inline rather than restarting the entire process.&lt;/p&gt;
&lt;p&gt;For a full walkthrough, refer to the &lt;a href=&quot;https://developers.cloudflare.com/pipelines/getting-started/&quot;&gt;Getting started guide&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><product>Pipelines</product><category>Pipelines</category><category>Workers</category></item><item><title>Stream - Stream live inputs can now be disabled and enabled</title><link>https://developers.cloudflare.com/changelog/post/2026-02-24-disable-live-inputs/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-24-disable-live-inputs/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;This gives you more control over your live inputs:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Temporarily pause an input without deleting it&lt;/li&gt;
&lt;li&gt;Programmatically end creator broadcasts&lt;/li&gt;
&lt;li&gt;Prevent new broadcasts from starting on a specific input&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To disable a live input via the API, set the &lt;code&gt;enabled&lt;/code&gt; property to &lt;code&gt;false&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; PUT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;https://api.cloudflare.com/client/v4/accounts/{&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;account_id}/stream/live_inputs/&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;{input_id}&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;--header &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Authorization: Bearer &amp;lt;API_TOKEN&amp;gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;--data &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;{&quot;enabled&quot;: false}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;You can also disable or enable a live input from the &lt;strong&gt;Live inputs&lt;/strong&gt; list page
or the live input detail page in the Dashboard.&lt;/p&gt;
&lt;p&gt;All existing live inputs remain enabled by default. For more information, refer
to &lt;a href=&quot;https://developers.cloudflare.com/stream/stream-live/start-stream-live/&quot;&gt;Start a live stream&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><product>Stream</product><category>Stream</category></item><item><title>Agents, R2, Containers - Backup and restore API for Sandbox SDK</title><link>https://developers.cloudflare.com/changelog/post/2026-02-23-sandbox-backup-restore-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-23-sandbox-backup-restore-api/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt; now support &lt;code&gt;createBackup()&lt;/code&gt; and &lt;code&gt;restoreBackup()&lt;/code&gt; methods for creating and restoring point-in-time snapshots of directories.&lt;/p&gt;
&lt;p&gt;This allows you to restore environments quickly. For instance, in order to develop in a sandbox, you may need to include a user&apos;s codebase and run a build step.
Unfortunately &lt;code&gt;git clone&lt;/code&gt; and &lt;code&gt;npm install&lt;/code&gt; can take minutes, and you don&apos;t want to run these steps every time the user starts their sandbox.&lt;/p&gt;
&lt;p&gt;Now, after the initial setup, you can just call &lt;code&gt;createBackup()&lt;/code&gt;, then &lt;code&gt;restoreBackup()&lt;/code&gt; 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.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; sandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getSandbox&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env.Sandbox, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Make non-trivial changes to the file system&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;gitCheckout&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(endUserRepo, { targetDir: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;/workspace&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;npm install&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { cwd: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;/workspace&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Create a point-in-time backup of the directory&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; backup&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;createBackup&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ dir: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;/workspace&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Store the handle for later use&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;KV&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;put&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`backup:${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;userId&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(backup));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// ... in a future session...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Restore instead of re-cloning and reinstalling&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;restoreBackup&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(backup);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Backups are stored in &lt;a href=&quot;https://developers.cloudflare.com/r2&quot;&gt;R2&lt;/a&gt; and can take advantage of &lt;a href=&quot;https://developers.cloudflare.com/sandbox/guides/backup-restore/#configure-r2-lifecycle-rules-for-automatic-cleanup&quot;&gt;R2 object lifecycle rules&lt;/a&gt; to ensure they do not persist forever.&lt;/p&gt;
&lt;p&gt;Key capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Persist and reuse across sandbox sessions&lt;/strong&gt; — Easily store backup handles in KV, D1, or Durable Object storage for use in subsequent sessions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usable across multiple instances&lt;/strong&gt; — Fork a backup across many sandboxes for parallel work&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Named backups&lt;/strong&gt; — Provide optional human-readable labels for easier management&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TTLs&lt;/strong&gt; — Set time-to-live durations so backups are automatically removed from storage once they are no longer needed&lt;/li&gt;
&lt;/ul&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;To get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/guides/backup-restore/&quot;&gt;backup and restore guide&lt;/a&gt; for setup instructions and usage patterns, or the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/api/backups/&quot;&gt;Backups API reference&lt;/a&gt; for full method documentation.&lt;/p&gt;</description><pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>R2</category><category>Containers</category></item><item><title>Hyperdrive - Hyperdrive no longer caches queries using STABLE PostgreSQL functions</title><link>https://developers.cloudflare.com/changelog/post/2026-02-23-hyperdrive-stable-functions-uncacheable/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-23-hyperdrive-stable-functions-uncacheable/</guid><description>&lt;p&gt;Hyperdrive now treats queries containing PostgreSQL &lt;code&gt;STABLE&lt;/code&gt; functions as uncacheable, in addition to &lt;code&gt;VOLATILE&lt;/code&gt; functions.&lt;/p&gt;
&lt;p&gt;Previously, only functions &lt;a href=&quot;https://www.postgresql.org/docs/current/xfunc-volatility.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;that PostgreSQL categorizes&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; as &lt;code&gt;VOLATILE&lt;/code&gt; (for example, &lt;code&gt;RANDOM()&lt;/code&gt;, &lt;code&gt;LASTVAL()&lt;/code&gt;) were detected as uncacheable. &lt;code&gt;STABLE&lt;/code&gt; functions (for example, &lt;code&gt;NOW()&lt;/code&gt;, &lt;code&gt;CURRENT_TIMESTAMP&lt;/code&gt;, &lt;code&gt;CURRENT_DATE&lt;/code&gt;) were incorrectly allowed to be cached.&lt;/p&gt;
&lt;p&gt;Because &lt;code&gt;STABLE&lt;/code&gt; 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&apos;s caching behavior with PostgreSQL&apos;s function volatility semantics.&lt;/p&gt;
&lt;p&gt;If your queries use &lt;code&gt;STABLE&lt;/code&gt; 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 &lt;code&gt;WHERE created_at &amp;gt; NOW()&lt;/code&gt;, compute the timestamp in your Worker and pass it as &lt;code&gt;WHERE created_at &amp;gt; $1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Hyperdrive uses text-based pattern matching to detect uncacheable functions. References to function names like &lt;code&gt;NOW()&lt;/code&gt; in SQL comments also cause the query to be marked as uncacheable.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/concepts/query-caching/&quot;&gt;Query caching&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/observability/troubleshooting/&quot;&gt;Troubleshoot and debug&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>Security Center - Saved views for Threat Events</title><link>https://developers.cloudflare.com/changelog/post/2026-02-23-Saved-views-in-threat-events/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-23-Saved-views-in-threat-events/</guid><description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;why-this-matters&quot;&gt;Why this matters&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#why-this-matters&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Analysts can now jump straight into &quot;Known Ransomware Infrastructure&quot; or &quot;Retail Sector Targets&quot; views with a single click, eliminating repetitive setup tasks&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cloudforce One subscribers can start saving their custom views now in &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/security-center/threat-intelligence/threat-events&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Application Security &amp;gt; Threat Intelligence &amp;gt; Threat Events&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Agents, Workers - @cloudflare/codemode v0.1.0: a new runtime agnostic modular architecture</title><link>https://developers.cloudflare.com/changelog/post/2026-02-20-codemode-sdk-rewrite/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-20-codemode-sdk-rewrite/</guid><description>
&lt;p&gt;The &lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/codemode&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@cloudflare/codemode&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; package has been rewritten into a modular, runtime-agnostic SDK.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.cloudflare.com/code-mode/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Code Mode&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;The new &lt;code&gt;Executor&lt;/code&gt; interface is runtime agnostic and comes with a prebuilt &lt;code&gt;DynamicWorkerExecutor&lt;/code&gt; to run generated code in a &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/worker-loader/&quot;&gt;Dynamic Worker Loader&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;breaking-changes&quot;&gt;Breaking changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#breaking-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Removed &lt;code&gt;experimental_codemode()&lt;/code&gt; and &lt;code&gt;CodeModeProxy&lt;/code&gt; — the package no longer owns an LLM call or model choice&lt;/li&gt;
&lt;li&gt;New import path: &lt;code&gt;createCodeTool()&lt;/code&gt; is now exported from &lt;code&gt;@cloudflare/codemode/ai&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-features&quot;&gt;New features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;createCodeTool()&lt;/code&gt;&lt;/strong&gt; — Returns a standard AI SDK &lt;code&gt;Tool&lt;/code&gt; to use in your AI agents.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Executor&lt;/code&gt; interface&lt;/strong&gt; — Minimal &lt;code&gt;execute(code, fns)&lt;/code&gt; contract. Implement for any code sandboxing primitive or runtime.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;dynamicworkerexecutor&quot;&gt;&lt;code&gt;DynamicWorkerExecutor&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#dynamicworkerexecutor&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Runs code in a &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/worker-loader/&quot;&gt;Dynamic Worker&lt;/a&gt;. It comes with the following features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Network isolation&lt;/strong&gt; — &lt;code&gt;fetch()&lt;/code&gt; and &lt;code&gt;connect()&lt;/code&gt; blocked by default (&lt;code&gt;globalOutbound: null&lt;/code&gt;) when using &lt;code&gt;DynamicWorkerExecutor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Console capture&lt;/strong&gt; — &lt;code&gt;console.log/warn/error&lt;/code&gt; captured and returned in &lt;code&gt;ExecuteResult.logs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Execution timeout&lt;/strong&gt; — Configurable via &lt;code&gt;timeout&lt;/code&gt; option (default 30s)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;usage&quot;&gt;Usage&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#usage&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createCodeTool } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/codemode/ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { DynamicWorkerExecutor } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/codemode&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { streamText } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; executor&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DynamicWorkerExecutor&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ loader: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; codemode&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createCodeTool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ tools: myTools, executor });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamText&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	tools: { codemode },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	messages,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createCodeTool } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/codemode/ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { DynamicWorkerExecutor } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/codemode&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { streamText } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; executor&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; DynamicWorkerExecutor&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ loader: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;LOADER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; codemode&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createCodeTool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ tools: myTools, executor });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamText&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	tools: { codemode },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	messages,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;wrangler-configuration&quot;&gt;Wrangler configuration&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#wrangler-configuration&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;worker_loaders&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [{ &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;LOADER&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;worker_loaders&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;LOADER&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/agents/tools/codemode/&quot;&gt;Code Mode documentation&lt;/a&gt; for full API reference and examples.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/codemode@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>CASB - Understand CASB findings instantly with Cloudy Summaries</title><link>https://developers.cloudflare.com/changelog/post/2026-02-20-cloudy-in-casb/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-20-cloudy-in-casb/</guid><description>&lt;p&gt;You can now easily understand your SaaS security posture findings and why they were detected with &lt;strong&gt;Cloudy Summaries in CASB&lt;/strong&gt;. This feature integrates Cloudflare&apos;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To view a summary, simply navigate to your Posture Findings in the Cloudflare One dashboard (under &lt;strong&gt;Cloud and SaaS findings&lt;/strong&gt;) and open the finding details of a specific instance of a Finding.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/cloud-and-saas/&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-capabilities&quot;&gt;Key capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Contextual explanations&lt;/strong&gt; — 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear risk assessment&lt;/strong&gt; — Instantly grasp the potential security impact of the finding, such as data breach risks, unauthorized account access, or email spoofing vulnerabilities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actionable guidance&lt;/strong&gt; — Get clear recommendations and next steps on how to effectively remediate the issue and secure your environment.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built-in feedback&lt;/strong&gt; — Help improve future AI summarization accuracy by submitting feedback directly using the thumbs-up and thumbs-down buttons.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;learn-more&quot;&gt;Learn more&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#learn-more&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Learn more about managing &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/cloud-and-saas-findings/&quot;&gt;CASB Posture Findings&lt;/a&gt; in Cloudflare.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cloudy Summaries in CASB are available to all Cloudflare CASB users today.&lt;/p&gt;</description><pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate><product>CASB</product><category>CASB</category></item><item><title>Cloudflare Tunnel, Cloudflare Tunnel for SASE - Manage Cloudflare Tunnel directly from the main Cloudflare Dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-02-20-tunnel-core-dashboard/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-20-tunnel-core-dashboard/</guid><description>
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; is now available in the main Cloudflare Dashboard at &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/tunnels&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Networking &amp;gt; Tunnels&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, bringing first-class Tunnel management to developers using Tunnel for securing origin servers.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=894,format=webp/_astro/tunnel-core-dashboard.BGPqaHfo.gif&quot; alt=&quot;Manage Tunnels in the Core Dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1800&quot; height=&quot;894&quot;&gt;
&lt;p&gt;This new experience provides everything you need to manage Tunnels for &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/routing-to-tunnel/&quot;&gt;public applications&lt;/a&gt;, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Full Tunnel lifecycle management&lt;/strong&gt;: Create, configure, delete, and monitor all your Tunnels in one place.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Native integrations&lt;/strong&gt;: View Tunnels by name when configuring &lt;a href=&quot;https://developers.cloudflare.com/dns/manage-dns-records/how-to/create-dns-records/&quot;&gt;DNS records&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/&quot;&gt;Workers VPC&lt;/a&gt; — no more copy-pasting UUIDs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real-time visibility&lt;/strong&gt;: Monitor &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/configure-tunnels/tunnel-availability/&quot;&gt;replicas&lt;/a&gt; and Tunnel &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/troubleshoot-tunnels/common-errors/#tunnel-status&quot;&gt;health status&lt;/a&gt; directly in the dashboard.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Routing map&lt;/strong&gt;: Manage all ingress routes for your Tunnel, including &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/routing-to-tunnel/&quot;&gt;public applications&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/cloudflared/connect-private-hostname/&quot;&gt;private hostnames&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/cloudflared/connect-cidr/&quot;&gt;private CIDRs&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/&quot;&gt;Workers VPC services&lt;/a&gt;, from a single interactive interface.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;choose-the-right-dashboard-for-your-use-case&quot;&gt;Choose the right dashboard for your use case&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#choose-the-right-dashboard-for-your-use-case&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Core Dashboard&lt;/strong&gt;: Navigate to &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/tunnels&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Networking &amp;gt; Tunnels&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to manage Tunnels for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Securing origin servers and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/routing-to-tunnel/&quot;&gt;public applications&lt;/a&gt; with CDN, WAF, Load Balancing, and DDoS protection&lt;/li&gt;
&lt;li&gt;Connecting &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/&quot;&gt;Workers to private services&lt;/a&gt; via Workers VPC&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare One Dashboard&lt;/strong&gt;: Navigate to &lt;a href=&quot;https://one.dash.cloudflare.com/?to=/:account/networks/connectors&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Zero Trust &amp;gt; Networks &amp;gt; Connectors&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to manage Tunnels for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Securing your public applications with &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/self-hosted-public-app/&quot;&gt;Zero Trust access policies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Connecting users to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/self-hosted-private-app/&quot;&gt;private applications&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Building a &lt;a href=&quot;https://developers.cloudflare.com/reference-architecture/architectures/sase/#connecting-networks&quot;&gt;private mesh network&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both dashboards provide complete Tunnel management capabilities — choose based on your primary workflow.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;New to Tunnel? Learn how to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/get-started/create-remote-tunnel/&quot;&gt;get started with Cloudflare Tunnel&lt;/a&gt; or explore advanced use cases like &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/ssh/&quot;&gt;securing SSH servers&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/deployment-guides/kubernetes/&quot;&gt;running Tunnels in Kubernetes&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 20 Feb 2026 00:00:00 GMT</pubDate><product>Cloudflare Tunnel</product><category>Cloudflare Tunnel</category><category>Cloudflare Tunnel for SASE</category></item><item><title>AI Gateway, Workers AI - AI dashboard experience improvements</title><link>https://developers.cloudflare.com/changelog/post/2026-02-19-ai-dashboard-experience-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-19-ai-dashboard-experience-improvements/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt; have received a series of dashboard improvements to help you get started faster and manage your AI workloads more easily.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Navigation and discoverability&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI now has its own top-level section in the Cloudflare dashboard sidebar, so you can find AI features without digging through menus.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2328,height=1140,format=webp/_astro/sidebar-navigation.BQNFBmAk.png&quot; alt=&quot;AI sidebar navigation in the Cloudflare dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2328&quot; height=&quot;1140&quot;&gt;
&lt;em&gt;The new top-level AI section in the dashboard sidebar.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Onboarding and getting started&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/get-started/&quot;&gt;Getting started&lt;/a&gt; with AI Gateway is now simpler. When you create your first gateway, we now show your gateway&apos;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.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2400,height=1232,format=webp/_astro/onboarding-flow.DZ7aMcHa.png&quot; alt=&quot;AI Gateway onboarding flow&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2400&quot; height=&quot;1232&quot;&gt;
&lt;em&gt;The first-run setup experience for new gateways.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We&apos;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dynamic Routing&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/features/dynamic-routing/&quot;&gt;route builder&lt;/a&gt; is now more performant and responsive.&lt;/li&gt;
&lt;li&gt;You can now copy route names to your clipboard with a single click.&lt;/li&gt;
&lt;li&gt;Code examples use the &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/universal/&quot;&gt;Universal Endpoint&lt;/a&gt; format, making it easier to integrate routes into your application.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Observability and analytics&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Small monetary values now display correctly in &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/observability/costs/&quot;&gt;cost analytics&lt;/a&gt; charts, so you can accurately track spending at any scale.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Accessibility&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improvements to keyboard navigation within the AI Gateway, specifically when exploring usage by &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/usage/providers/&quot;&gt;provider&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Improvements to sorting and filtering components on the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/&quot;&gt;Workers AI&lt;/a&gt; models page.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 19 Feb 2026 00:00:00 GMT</pubDate><product>AI Gateway</product><category>AI Gateway</category><category>Workers AI</category></item><item><title>Digital Experience Monitoring - DEX Supports EU Customer Metadata Boundary</title><link>https://developers.cloudflare.com/changelog/post/2026-02-19-dex-supports-cmb-eu/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-19-dex-supports-cmb-eu/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/dex/&quot;&gt;Digital Experience Monitoring (DEX)&lt;/a&gt; provides visibility into &lt;a href=&quot;https://developers.cloudflare.com/warp-client/&quot;&gt;WARP&lt;/a&gt; device connectivity and performance to any internal or external application.&lt;/p&gt;
&lt;p&gt;Now, all DEX logs are fully compatible with Cloudflare&apos;s &lt;a href=&quot;https://developers.cloudflare.com/data-localization/metadata-boundary/&quot;&gt;Customer Metadata Boundary&lt;/a&gt; (CMB) setting for the &apos;EU&apos; (European Union), which ensures that DEX logs will not be stored outside the &apos;EU&apos; when the option is configured.&lt;/p&gt;
&lt;p&gt;If a Cloudflare One customer using DEX enables CMB &apos;EU&apos;, they will not see any DEX data in the Cloudflare One dashboard. Customers can ingest DEX data via &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/&quot;&gt;LogPush&lt;/a&gt;, and build their own analytics and dashboards.&lt;/p&gt;
&lt;p&gt;If a customer enables CMB in their account, they will see the following message in the Digital Experience dashboard: &quot;DEX data is unavailable because Customer Metadata Boundary configuration is on. Use Cloudflare LogPush to export DEX datasets.&quot;&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2143,height=1221,format=webp/_astro/dex_supports_cmb.6YOLXjHN.png&quot; alt=&quot;Digital Experience Monitoring message when Customer Metadata Boundary for the EU is enabled&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2143&quot; height=&quot;1221&quot;&gt;</description><pubDate>Thu, 19 Feb 2026 00:00:00 GMT</pubDate><product>Digital Experience Monitoring</product><category>Digital Experience Monitoring</category></item><item><title>Security Center - Cloudforce One Threat events graphs are now visible in the dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-02-19-threat-events-graphs/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-19-threat-events-graphs/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;What&apos;s new:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sankey Diagrams&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2652,height=1186,format=webp/_astro/2026-02-19-sankey-diagram.VZMSmdZL.png&quot; alt=&quot;Sankey Diagram&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2652&quot; height=&quot;1186&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dataset Distribution over time&lt;/strong&gt;: Instantly pivot your view to understand if a specific campaign is targeting your sector or if it is a broad-spectrum commodity attack.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2648,height=1176,format=webp/_astro/2026-02-19-events-over-time.CqD7VKqA.png&quot; alt=&quot;Events over time&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2648&quot; height=&quot;1176&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enhanced Filtering&lt;/strong&gt;: Use these visual tools to filter and drill down into specific attack vectors directly from the charts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cloudforce One subscribers can explore these new views now in &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/security-center/threat-intelligence/threat-events&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Application Security &amp;gt; Threat Intelligence &amp;gt; Threat Events&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 19 Feb 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Analytics - New cfWorker metric in Server-Timing header</title><link>https://developers.cloudflare.com/changelog/post/2026-02-18-cfworker-server-timing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-18-cfworker-server-timing/</guid><description>&lt;p&gt;The Server-Timing header now includes a new &lt;code&gt;cfWorker&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;Previously, Worker execution time was included in the &lt;code&gt;edge&lt;/code&gt; metric, making it harder to identify true edge performance. The new &lt;code&gt;cfWorker&lt;/code&gt; metric provides this visibility:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;edge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Total time spent on the Cloudflare edge, including Worker execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;origin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Time spent fetching from the origin server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cfWorker&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Time spent in Worker execution, including subrequests but excluding origin fetch time&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-response&quot;&gt;Example response&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-response&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;Server-Timing: cdn-cache; desc=DYNAMIC, edge; dur=20, origin; dur=100, cfWorker; dur=7&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;In this example, the edge took 20ms, the origin took 100ms, and the Worker added just 7ms of processing time.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;availability&quot;&gt;Availability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#availability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;cfWorker&lt;/code&gt; metric is enabled by default if you have &lt;a href=&quot;https://developers.cloudflare.com/web-analytics/&quot;&gt;Real User Monitoring (RUM)&lt;/a&gt; enabled. Otherwise, you can enable it using &lt;a href=&quot;https://developers.cloudflare.com/rules/&quot;&gt;Rules&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This metric is particularly useful for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performance debugging&lt;/strong&gt;: Quickly determine if latency is caused by Worker code, external API calls within Workers, or slow origins.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimization targeting&lt;/strong&gt;: Identify which component of your request path needs optimization.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real User Monitoring (RUM)&lt;/strong&gt;: Access detailed timing breakdowns directly from response headers for client-side analytics.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information about Server-Timing headers, refer to the &lt;a href=&quot;https://www.w3.org/TR/server-timing/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;W3C Server Timing specification&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 18 Feb 2026 00:00:00 GMT</pubDate><product>Analytics</product><category>Analytics</category></item><item><title>Access - Streamlined clientless browser isolation for private applications</title><link>https://developers.cloudflare.com/changelog/post/2026-02-17-clientless-access-for-private-apps/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-17-clientless-access-for-private-apps/</guid><description>&lt;p&gt;A new &lt;strong&gt;Allow clientless access&lt;/strong&gt; setting makes it easier to connect users without a device client to internal applications, without using public DNS.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1117,height=206,format=webp/_astro/allow-clientless-access.BHKwQuVt.png&quot; alt=&quot;Allow clientless access setting in the Cloudflare One dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1117&quot; height=&quot;206&quot;&gt;
&lt;p&gt;Previously, to provide clientless access to a private hostname or IP without a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/routes/add-routes/#add-a-published-application-route&quot;&gt;published application&lt;/a&gt;, you had to create a separate &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/bookmarks/&quot;&gt;bookmark application&lt;/a&gt; pointing to a prefixed &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/setup/clientless-browser-isolation/&quot;&gt;Clientless Web Isolation&lt;/a&gt; URL (for example, &lt;code&gt;https://&amp;lt;your-teamname&amp;gt;.cloudflareaccess.com/browser/https://10.0.0.1/&lt;/code&gt;). This bookmark was visible to all users in the App Launcher, regardless of whether they had access to the underlying application.&lt;/p&gt;
&lt;p&gt;Now, you can manage clientless access directly within your &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/self-hosted-private-app/&quot;&gt;private self-hosted application&lt;/a&gt;. When  &lt;strong&gt;Allow clientless access&lt;/strong&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/remote-browser-isolation/setup/clientless-browser-isolation/&quot;&gt;remote browser permissions&lt;/a&gt; to open the link.&lt;/p&gt;</description><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Access - Policies for bookmark applications</title><link>https://developers.cloudflare.com/changelog/post/2026-02-17-policies-for-bookmarks/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-17-policies-for-bookmarks/</guid><description>&lt;p&gt;You can now assign &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/&quot;&gt;Access policies&lt;/a&gt; to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/bookmarks/&quot;&gt;bookmark applications&lt;/a&gt;. This lets you control which users see a bookmark in the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/app-launcher/&quot;&gt;App Launcher&lt;/a&gt; based on identity, device posture, and other policy rules.&lt;/p&gt;
&lt;p&gt;Previously, bookmark applications were visible to all users in your organization. With policy support, you can now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tailor the App Launcher to each user&lt;/strong&gt; — Users only see the applications they have access to, reducing clutter and preventing accidental clicks on irrelevant resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Restrict visibility of sensitive bookmarks&lt;/strong&gt; — Limit who can view bookmarks to internal tools or partner resources based on group membership, identity provider, or device posture.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bookmarks support all &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/&quot;&gt;Access policy configurations&lt;/a&gt; except purpose justification, temporary authentication, and application isolation. If no policy is assigned, the bookmark remains visible to all users (maintaining backwards compatibility).&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/bookmarks/&quot;&gt;Add bookmarks&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Agents, Workers - Agents SDK v0.5.0: Protocol message control, retry utilities, data parts, and @cloudflare/ai-chat v0.1.0</title><link>https://developers.cloudflare.com/changelog/post/2026-02-17-agents-sdk-v0.5.0/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-17-agents-sdk-v0.5.0/</guid><description>
&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; adds built-in retry utilities, per-connection protocol message control, and a fully rewritten &lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; with data parts, tool approval persistence, and zero breaking changes.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;retry-utilities&quot;&gt;Retry utilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#retry-utilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;A new &lt;code&gt;this.retry()&lt;/code&gt; method lets you retry any async operation with exponential backoff and jitter. You can pass an optional &lt;code&gt;shouldRetry&lt;/code&gt; predicate to bail early on non-retryable errors.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onRequest&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;retry&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(() &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; callUnreliableService&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(), {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			maxAttempts: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			shouldRetry&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; !&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(err &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;instanceof&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; PermanentError&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(data);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onRequest&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; data&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;retry&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(() &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; callUnreliableService&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(), {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			maxAttempts: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			shouldRetry&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; !&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(err &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;instanceof&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; PermanentError&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Response.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(data);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;Retry options are also available per-task on &lt;code&gt;queue()&lt;/code&gt;, &lt;code&gt;schedule()&lt;/code&gt;, &lt;code&gt;scheduleEvery()&lt;/code&gt;, and &lt;code&gt;addMcpServer()&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Per-task retry configuration, persisted in SQLite alongside the task&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;schedule&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	Date.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 60_000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;	&quot;sendReport&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{ userId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;abc&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		retry: { maxAttempts: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Class-level retry defaults&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	static&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt; options&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		retry: { maxAttempts: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Per-task retry configuration, persisted in SQLite alongside the task&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;schedule&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(Date.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 60_000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;sendReport&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { userId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;abc&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	retry: { maxAttempts: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Class-level retry defaults&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	static&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt; options&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		retry: { maxAttempts: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Retry options are validated eagerly at enqueue/schedule time, and invalid values throw immediately. Internal retries have also been added for workflow operations (&lt;code&gt;terminateWorkflow&lt;/code&gt;, &lt;code&gt;pauseWorkflow&lt;/code&gt;, and others) with Durable Object-aware error detection.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;per-connection-protocol-message-control&quot;&gt;Per-connection protocol message control&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#per-connection-protocol-message-control&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	shouldSendProtocolMessages&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;connection&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Suppress protocol messages for MQTT clients&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; subprotocol&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ctx.request.headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Sec-WebSocket-Protocol&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; subprotocol &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!==&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;mqtt&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	shouldSendProtocolMessages&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;connection&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Connection&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ConnectionContext&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Suppress protocol messages for MQTT clients&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; subprotocol&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ctx.request.headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Sec-WebSocket-Protocol&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; subprotocol &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!==&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;mqtt&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Connections with protocol messages disabled still fully participate in RPC and regular messaging. Use &lt;code&gt;isConnectionProtocolEnabled(connection)&lt;/code&gt; to check a connection&apos;s status at any time. The flag persists across Durable Object hibernation.&lt;/p&gt;
&lt;p&gt;See &lt;a href=&quot;https://developers.cloudflare.com/agents/runtime/communication/protocol-messages/&quot;&gt;Protocol messages&lt;/a&gt; for full documentation.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cloudflareai-chat-v010&quot;&gt;&lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; v0.1.0&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cloudflareai-chat-v010&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The first stable release of &lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; ships alongside this release with a major refactor of &lt;code&gt;AIChatAgent&lt;/code&gt; internals — new &lt;code&gt;ResumableStream&lt;/code&gt; class, WebSocket &lt;code&gt;ChatTransport&lt;/code&gt;, and simplified SSE parsing — with zero breaking changes. Existing code using &lt;code&gt;AIChatAgent&lt;/code&gt; and &lt;code&gt;useAgentChat&lt;/code&gt; works as-is.&lt;/p&gt;
&lt;p&gt;Key new features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data parts&lt;/strong&gt; — Attach typed JSON blobs (&lt;code&gt;data-*&lt;/code&gt;) to messages alongside text. Supports reconciliation (type+id updates in-place), append, and transient parts (ephemeral via &lt;code&gt;onData&lt;/code&gt; callback). See &lt;a href=&quot;https://developers.cloudflare.com/agents/communication-channels/chat/chat-agents/#data-parts&quot;&gt;Data parts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool approval persistence&lt;/strong&gt; — The &lt;code&gt;needsApproval&lt;/code&gt; approval UI now survives page refresh and DO hibernation. The streaming message is persisted to SQLite when a tool enters &lt;code&gt;approval-requested&lt;/code&gt; state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;maxPersistedMessages&lt;/code&gt;&lt;/strong&gt; — Cap SQLite message storage with automatic oldest-message deletion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;body&lt;/code&gt; option on &lt;code&gt;useAgentChat&lt;/code&gt;&lt;/strong&gt; — Send custom data with every request (static or dynamic).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incremental persistence&lt;/strong&gt; — Hash-based cache to skip redundant SQL writes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Row size guard&lt;/strong&gt; — Automatic two-pass compaction when messages approach the SQLite 2 MB limit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;autoContinueAfterToolResult&lt;/code&gt; defaults to &lt;code&gt;true&lt;/code&gt;&lt;/strong&gt; — Client-side tool results and tool approvals now automatically trigger a server continuation, matching server-executed tool behavior. Set &lt;code&gt;autoContinueAfterToolResult: false&lt;/code&gt; in &lt;code&gt;useAgentChat&lt;/code&gt; to restore the previous behavior.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notable bug fixes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resolved stream resumption race conditions&lt;/li&gt;
&lt;li&gt;Resolved an issue where &lt;code&gt;setMessages&lt;/code&gt; functional updater sent empty arrays&lt;/li&gt;
&lt;li&gt;Resolved an issue where client tool schemas were lost after DO hibernation&lt;/li&gt;
&lt;li&gt;Resolved &lt;code&gt;InvalidPromptError&lt;/code&gt; after tool approval (&lt;code&gt;approval.id&lt;/code&gt; was dropped)&lt;/li&gt;
&lt;li&gt;Resolved an issue where message metadata was not propagated on broadcast/resume paths&lt;/li&gt;
&lt;li&gt;Resolved an issue where &lt;code&gt;clearAll()&lt;/code&gt; did not clear in-memory chunk buffers&lt;/li&gt;
&lt;li&gt;Resolved an issue where &lt;code&gt;reasoning-delta&lt;/code&gt; silently dropped data when &lt;code&gt;reasoning-start&lt;/code&gt; was missed during stream resumption&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;synchronous-queue-and-schedule-getters&quot;&gt;Synchronous queue and schedule getters&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#synchronous-queue-and-schedule-getters&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;getQueue()&lt;/code&gt;, &lt;code&gt;getQueues()&lt;/code&gt;, &lt;code&gt;getSchedule()&lt;/code&gt;, &lt;code&gt;dequeue()&lt;/code&gt;, &lt;code&gt;dequeueAll()&lt;/code&gt;, and &lt;code&gt;dequeueAllByCallback()&lt;/code&gt; were unnecessarily &lt;code&gt;async&lt;/code&gt; despite only performing synchronous SQL operations. They now return values directly instead of wrapping them in Promises. This is backward compatible — existing code using &lt;code&gt;await&lt;/code&gt; on these methods will continue to work.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;other-improvements&quot;&gt;Other improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#other-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fix TypeScript &quot;excessively deep&quot; error&lt;/strong&gt; — A depth counter on &lt;code&gt;CanSerialize&lt;/code&gt; and &lt;code&gt;IsSerializableParam&lt;/code&gt; types bails out to &lt;code&gt;true&lt;/code&gt; after 10 levels of recursion, preventing the &quot;Type instantiation is excessively deep&quot; error with deeply nested types like AI SDK &lt;code&gt;CoreMessage[]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;POST SSE keepalive&lt;/strong&gt; — The POST SSE handler now sends &lt;code&gt;event: ping&lt;/code&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Widened peer dependency ranges&lt;/strong&gt; — Peer dependency ranges across packages have been widened to prevent cascading major bumps during 0.x minor releases. &lt;code&gt;@cloudflare/ai-chat&lt;/code&gt; and &lt;code&gt;@cloudflare/codemode&lt;/code&gt; are now marked as optional peer dependencies.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; agents@latest&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/ai-chat@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Cloudflare One, Cloudflare WAN, Cloudflare Network Firewall, Network Flow - Cloudflare One Product Name Updates</title><link>https://developers.cloudflare.com/changelog/post/2026-02-17-product-name-updates/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-17-product-name-updates/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-changing&quot;&gt;What&apos;s changing&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-changing&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Magic WAN&lt;/strong&gt; → &lt;strong&gt;Cloudflare WAN&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magic WAN IPsec&lt;/strong&gt; → &lt;strong&gt;Cloudflare IPsec&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magic WAN GRE&lt;/strong&gt; → &lt;strong&gt;Cloudflare GRE&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magic WAN Connector&lt;/strong&gt; → &lt;strong&gt;Cloudflare One Appliance&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magic Firewall&lt;/strong&gt; → &lt;strong&gt;Cloudflare Network Firewall&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magic Network Monitoring&lt;/strong&gt; → &lt;strong&gt;Network Flow&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magic Cloud Networking&lt;/strong&gt; → &lt;strong&gt;Cloudflare One Multi-cloud Networking&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;No action is required by you&lt;/strong&gt; — all functionality, existing configurations, and billing will remain exactly the same.&lt;/p&gt;
&lt;p&gt;For more information, visit the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/&quot;&gt;Cloudflare One documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category><category>Cloudflare WAN</category><category>Cloudflare Network Firewall</category><category>Network Flow</category></item><item><title>Containers - Docker-in-Docker support added to Containers and Sandboxes</title><link>https://developers.cloudflare.com/changelog/post/2026-02-17-docker-in-docker/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-17-docker-in-docker/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt; now support running Docker for &quot;Docker-in-Docker&quot; setups. This is particularly useful when your end users or &lt;a href=&quot;https://developers.cloudflare.com/agents&quot;&gt;agents&lt;/a&gt; want to run a full sandboxed development environment.&lt;/p&gt;
&lt;p&gt;This allows you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Develop containerized applications with your Sandbox&lt;/li&gt;
&lt;li&gt;Run isolated test environments for images&lt;/li&gt;
&lt;li&gt;Build container images as part of CI/CD workflows&lt;/li&gt;
&lt;li&gt;Deploy arbitrary images supplied at runtime within a container&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For &lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandbox SDK&lt;/a&gt; users, see the &lt;a href=&quot;https://developers.cloudflare.com/sandbox/guides/docker-in-docker/&quot;&gt;Docker-in-Docker guide&lt;/a&gt; for instructions on combining Docker with the SandboxSDK. For general Containers usage, see the &lt;a href=&quot;https://developers.cloudflare.com/containers/faq/#can-i-run-docker-inside-a-container-docker-in-docker&quot;&gt;Containers FAQ&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Cloudflare Fundamentals - Content encoding support for Markdown for Agents and other improvements</title><link>https://developers.cloudflare.com/changelog/post/2026-02-16-markdown-for-agents-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-16-markdown-for-agents-improvements/</guid><description>&lt;p&gt;When AI systems request pages from any website that uses Cloudflare and has &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/&quot;&gt;Markdown for Agents&lt;/a&gt; enabled, they can express the preference for &lt;code&gt;text/markdown&lt;/code&gt; in the request: our network will automatically and efficiently convert the HTML to markdown, when possible, on the fly.&lt;/p&gt;
&lt;p&gt;This release adds the following improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The origin response limit was raised from 1 MB to 2 MB (2,097,152 bytes).&lt;/li&gt;
&lt;li&gt;We no longer require the origin to send the &lt;code&gt;content-length&lt;/code&gt; header.&lt;/li&gt;
&lt;li&gt;We now support content encoded responses from the origin.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you haven’t enabled automatic Markdown conversion yet, visit the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/:zone/ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI Crawl Control&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; section of the Cloudflare dashboard and enable &lt;strong&gt;Markdown for Agents&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Refer to our &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/&quot;&gt;developer documentation&lt;/a&gt; for more details.&lt;/p&gt;</description><pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>WAF - WAF Release - 2026-02-16</title><link>https://developers.cloudflare.com/changelog/post/2026-02-16-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-16-waf-release/</guid><description>
&lt;p&gt;This week’s release introduces new detections for CVE-2025-68645 and CVE-2025-31125.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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 &lt;code&gt;/h/rest&lt;/code&gt; endpoint, improperly influence internal dispatching, and include arbitrary files from the WebRoot directory.&lt;/li&gt;
&lt;li&gt;CVE-2025-31125: Vite, the JavaScript frontend tooling framework, exposes content of non-allowed files via &lt;code&gt;?inline&amp;amp;import&lt;/code&gt; when its development server is network-exposed, enabling unauthorized attackers to read arbitrary files and potentially leak sensitive information.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;695d76ff756844d384cab548833761f7&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...833761f7&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Zimbra - Local File Inclusion - CVE:CVE-2025-68645&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;38fff9f3deba46a2abc10a8f950ed8c8&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...950ed8c8&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Vite - WASM Import Path Traversal - CVE:CVE-2025-31125&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - Quick Editor devtools replaced with log viewer</title><link>https://developers.cloudflare.com/changelog/post/2026-02-12-quick-editor-dev-tools-deprecation/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-12-quick-editor-dev-tools-deprecation/</guid><description>&lt;p&gt;Cloudflare has deprecated the Workers Quick Editor dev tools inspector and replaced it with a lightweight log viewer.&lt;/p&gt;
&lt;p&gt;This aligns our logging with &lt;code&gt;wrangler tail&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/workers/playground/&quot;&gt;Workers Playground docs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;wrangler init --from-dash&lt;/code&gt; command. For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#init&quot;&gt;Wrangler commands&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 16 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - New Best Practices guide for Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-02-15-workers-best-practices/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-15-workers-best-practices/</guid><description>
&lt;p&gt;A new &lt;a href=&quot;https://developers.cloudflare.com/workers/best-practices/workers-best-practices/&quot;&gt;Workers Best Practices&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Key guidance includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keep your compatibility date current and enable &lt;code&gt;nodejs_compat&lt;/code&gt;&lt;/strong&gt; — Ensure you have access to the latest runtime features and Node.js built-in modules.&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;main&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;src/index.ts&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Set this to today&apos;s date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;compatibility_date&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-08-14&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;compatibility_flags&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;nodejs_compat&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;main = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;src/index.ts&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Set this to today&apos;s date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;compatibility_date = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-08-14&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;compatibility_flags = [ &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;nodejs_compat&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Generate binding types with &lt;code&gt;wrangler types&lt;/code&gt;&lt;/strong&gt; — Never hand-write your &lt;code&gt;Env&lt;/code&gt; interface. Let Wrangler generate it from your actual configuration to catch mismatches at compile time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stream request and response bodies&lt;/strong&gt; — Avoid buffering large payloads in memory. Use &lt;code&gt;TransformStream&lt;/code&gt; and &lt;code&gt;pipeTo&lt;/code&gt; to stay within the 128 MB memory limit and improve time-to-first-byte.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use bindings, not REST APIs&lt;/strong&gt; — Bindings to KV, R2, D1, Queues, and other Cloudflare services are direct, in-process references with no network hop and no authentication overhead.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Queues and Workflows for background work&lt;/strong&gt; — 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable Workers Logs and Traces&lt;/strong&gt; — Configure observability before deploying to production so you have data when you need to debug.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avoid global mutable state&lt;/strong&gt; — Workers reuse isolates across requests. Storing request-scoped data in module-level variables causes cross-request data leaks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Always &lt;code&gt;await&lt;/code&gt; or &lt;code&gt;waitUntil&lt;/code&gt; your Promises&lt;/strong&gt; — Floating promises cause silent bugs and dropped work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use Web Crypto for secure token generation&lt;/strong&gt; — Never use &lt;code&gt;Math.random()&lt;/code&gt; for security-sensitive operations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To learn more, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/best-practices/workers-best-practices/&quot;&gt;Workers Best Practices&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare Fundamentals, Access - Fine-grained permissions for Access policies and service tokens</title><link>https://developers.cloudflare.com/changelog/post/2026-02-13-access-policy-service-token-permissions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-13-access-policy-service-token-permissions/</guid><description>&lt;p&gt;Fine-grained permissions for &lt;strong&gt;Access policies&lt;/strong&gt; and &lt;strong&gt;Access service tokens&lt;/strong&gt; are available. These new resource-scoped roles expand the existing RBAC model, enabling administrators to grant permissions scoped to individual resources.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-roles&quot;&gt;New roles&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-roles&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Access policy admin&lt;/strong&gt;: Can edit a specific &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/&quot;&gt;Access policy&lt;/a&gt; in an account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Access service token admin&lt;/strong&gt;: Can edit a specific &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/service-credentials/service-tokens/&quot;&gt;Access service token&lt;/a&gt; in an account.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These roles complement the existing resource-scoped roles for Access applications, identity providers, and infrastructure targets.&lt;/p&gt;
&lt;p&gt;For more information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/roles/#resource-scoped-roles&quot;&gt;Resource-scoped roles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/scope/&quot;&gt;Role scopes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;Resource-scoped roles is currently in beta.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;</description><pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>Access</category></item><item><title>Cloudflare Fundamentals, SDK - Cloudflare Python SDK v5.0.0-beta.1 now available</title><link>https://developers.cloudflare.com/changelog/post/2026-02-13-cloudflare-python-v5.0.0-beta.1/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-13-cloudflare-python-v5.0.0-beta.1/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; Please note that v5.0.0-beta.1 is in Beta and we are still testing it for stability.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Full Changelog: &lt;a href=&quot;https://github.com/cloudflare/cloudflare-python/compare/v4.3.1...v5.0.0-beta.1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v4.3.1...v5.0.0-beta.1&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In this release, you&apos;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;breaking-changes&quot;&gt;Breaking Changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#breaking-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;The following resources have breaking changes. See the &lt;a href=&quot;https://github.com/cloudflare/cloudflare-python/blob/main/docs/v5-migration-guide.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v5 Migration Guide&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; for detailed migration instructions.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;abusereports&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;acm.totaltls&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;apigateway.configurations&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cloudforceone.threatevents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;d1.database&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;intel.indicatorfeeds&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;logpush.edge&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;origintlsclientauth.hostnames&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;queues.consumers&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;radar.bgp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rulesets.rules&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;schemavalidation.schemas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;snippets&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zerotrust.dlp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zerotrust.networks&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;features&quot;&gt;Features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-api-resources&quot;&gt;New API Resources&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-api-resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;abusereports&lt;/code&gt; - Abuse report management&lt;/li&gt;
&lt;li&gt;&lt;code&gt;abusereports.mitigations&lt;/code&gt; - Abuse report mitigation actions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ai.tomarkdown&lt;/code&gt; - AI-powered markdown conversion&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aigateway.dynamicrouting&lt;/code&gt; - AI Gateway dynamic routing configuration&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aigateway.providerconfigs&lt;/code&gt; - AI Gateway provider configurations&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aisearch&lt;/code&gt; - AI-powered search functionality&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aisearch.instances&lt;/code&gt; - AI Search instance management&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aisearch.tokens&lt;/code&gt; - AI Search authentication tokens&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alerting.silences&lt;/code&gt; - Alert silence management&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brandprotection.logomatches&lt;/code&gt; - Brand protection logo match detection&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brandprotection.logos&lt;/code&gt; - Brand protection logo management&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brandprotection.matches&lt;/code&gt; - Brand protection match results&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brandprotection.queries&lt;/code&gt; - Brand protection query management&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cloudforceone.binarystorage&lt;/code&gt; - CloudForce One binary storage&lt;/li&gt;
&lt;li&gt;&lt;code&gt;connectivity.directory&lt;/code&gt; - Connectivity directory services&lt;/li&gt;
&lt;li&gt;&lt;code&gt;d1.database&lt;/code&gt; - D1 database management&lt;/li&gt;
&lt;li&gt;&lt;code&gt;diagnostics.endpointhealthchecks&lt;/code&gt; - Endpoint health check diagnostics&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fraud&lt;/code&gt; - Fraud detection and prevention&lt;/li&gt;
&lt;li&gt;&lt;code&gt;iam.sso&lt;/code&gt; - IAM Single Sign-On configuration&lt;/li&gt;
&lt;li&gt;&lt;code&gt;loadbalancers.monitorgroups&lt;/code&gt; - Load balancer monitor groups&lt;/li&gt;
&lt;li&gt;&lt;code&gt;organizations&lt;/code&gt; - Organization management&lt;/li&gt;
&lt;li&gt;&lt;code&gt;organizations.organizationprofile&lt;/code&gt; - Organization profile settings&lt;/li&gt;
&lt;li&gt;&lt;code&gt;origintlsclientauth.hostnamecertificates&lt;/code&gt; - Origin TLS client auth hostname certificates&lt;/li&gt;
&lt;li&gt;&lt;code&gt;origintlsclientauth.hostnames&lt;/code&gt; - Origin TLS client auth hostnames&lt;/li&gt;
&lt;li&gt;&lt;code&gt;origintlsclientauth.zonecertificates&lt;/code&gt; - Origin TLS client auth zone certificates&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pipelines&lt;/code&gt; - Data pipeline management&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pipelines.sinks&lt;/code&gt; - Pipeline sink configurations&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pipelines.streams&lt;/code&gt; - Pipeline stream configurations&lt;/li&gt;
&lt;li&gt;&lt;code&gt;queues.subscriptions&lt;/code&gt; - Queue subscription management&lt;/li&gt;
&lt;li&gt;&lt;code&gt;r2datacatalog&lt;/code&gt; - R2 Data Catalog integration&lt;/li&gt;
&lt;li&gt;&lt;code&gt;r2datacatalog.credentials&lt;/code&gt; - R2 Data Catalog credentials&lt;/li&gt;
&lt;li&gt;&lt;code&gt;r2datacatalog.maintenanceconfigs&lt;/code&gt; - R2 Data Catalog maintenance configurations&lt;/li&gt;
&lt;li&gt;&lt;code&gt;r2datacatalog.namespaces&lt;/code&gt; - R2 Data Catalog namespaces&lt;/li&gt;
&lt;li&gt;&lt;code&gt;radar.bots&lt;/code&gt; - Radar bot analytics&lt;/li&gt;
&lt;li&gt;&lt;code&gt;radar.ct&lt;/code&gt; - Radar certificate transparency data&lt;/li&gt;
&lt;li&gt;&lt;code&gt;radar.geolocations&lt;/code&gt; - Radar geolocation data&lt;/li&gt;
&lt;li&gt;&lt;code&gt;realtimekit.activesession&lt;/code&gt; - Real-time Kit active session management&lt;/li&gt;
&lt;li&gt;&lt;code&gt;realtimekit.analytics&lt;/code&gt; - Real-time Kit analytics&lt;/li&gt;
&lt;li&gt;&lt;code&gt;realtimekit.apps&lt;/code&gt; - Real-time Kit application management&lt;/li&gt;
&lt;li&gt;&lt;code&gt;realtimekit.livestreams&lt;/code&gt; - Real-time Kit live streaming&lt;/li&gt;
&lt;li&gt;&lt;code&gt;realtimekit.meetings&lt;/code&gt; - Real-time Kit meeting management&lt;/li&gt;
&lt;li&gt;&lt;code&gt;realtimekit.presets&lt;/code&gt; - Real-time Kit preset configurations&lt;/li&gt;
&lt;li&gt;&lt;code&gt;realtimekit.recordings&lt;/code&gt; - Real-time Kit recording management&lt;/li&gt;
&lt;li&gt;&lt;code&gt;realtimekit.sessions&lt;/code&gt; - Real-time Kit session management&lt;/li&gt;
&lt;li&gt;&lt;code&gt;realtimekit.webhooks&lt;/code&gt; - Real-time Kit webhook configurations&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tokenvalidation.configuration&lt;/code&gt; - Token validation configuration&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tokenvalidation.rules&lt;/code&gt; - Token validation rules&lt;/li&gt;
&lt;li&gt;&lt;code&gt;workers.beta&lt;/code&gt; - Workers beta features&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-endpoints-existing-resources&quot;&gt;New Endpoints (Existing Resources)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-endpoints-existing-resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;acmtotaltls&quot;&gt;&lt;code&gt;acm.totaltls&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#acmtotaltls&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;edit()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cloudforceonethreatevents&quot;&gt;&lt;code&gt;cloudforceone.threatevents&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cloudforceonethreatevents&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;list()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;contentscanning&quot;&gt;&lt;code&gt;contentscanning&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#contentscanning&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;dnsrecords&quot;&gt;&lt;code&gt;dns.records&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#dnsrecords&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;scan_list()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scan_review()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scan_trigger()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;intelindicatorfeeds&quot;&gt;&lt;code&gt;intel.indicatorfeeds&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#intelindicatorfeeds&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;list()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;leakedcredentialchecksdetections&quot;&gt;&lt;code&gt;leakedcredentialchecks.detections&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#leakedcredentialchecksdetections&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;get()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;queuesconsumers&quot;&gt;&lt;code&gt;queues.consumers&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#queuesconsumers&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;list()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;radarai&quot;&gt;&lt;code&gt;radar.ai&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#radarai&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;summary()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;timeseries()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;timeseries_groups()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;radarbgp&quot;&gt;&lt;code&gt;radar.bgp&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#radarbgp&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;changes()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;snapshot()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;workerssubdomains&quot;&gt;&lt;code&gt;workers.subdomains&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#workerssubdomains&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;delete()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;zerotrustnetworks&quot;&gt;&lt;code&gt;zerotrust.networks&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#zerotrustnetworks&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;edit()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;list()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;general-fixes-and-improvements&quot;&gt;General Fixes and Improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#general-fixes-and-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;type-system--compatibility&quot;&gt;Type System &amp;amp; Compatibility&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#type-system--compatibility&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Type inference improvements&lt;/strong&gt;: Allow Pyright to properly infer TypedDict types within SequenceNotStr&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type completeness&lt;/strong&gt;: Add missing types to method arguments and response models&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pydantic compatibility&lt;/strong&gt;: Ensure compatibility with Pydantic versions prior to 2.8.0 when using additional fields&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;requestresponse-handling&quot;&gt;Request/Response Handling&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#requestresponse-handling&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multipart form data&lt;/strong&gt;: Correctly handle sending multipart/form-data requests with JSON data&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Header handling&lt;/strong&gt;: Do not send headers with default values set to omit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GET request headers&lt;/strong&gt;: Don&apos;t send Content-Type header on GET requests&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Response body model accuracy&lt;/strong&gt;: Broad improvements to the correctness of models&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;parsing--data-processing&quot;&gt;Parsing &amp;amp; Data Processing&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#parsing--data-processing&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Discriminated unions&lt;/strong&gt;: Correctly handle nested discriminated unions in response parsing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Extra field types&lt;/strong&gt;: Parse extra field types correctly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Empty metadata&lt;/strong&gt;: Ignore empty metadata fields during parsing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Singularization rules&lt;/strong&gt;: Update resource name singularization rules for better consistency&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>SDK</category></item><item><title>Workers, Agents, Workers AI - Introducing GLM-4.7-Flash on Workers AI, @cloudflare/tanstack-ai, and workers-ai-provider v3.1.1</title><link>https://developers.cloudflare.com/changelog/post/2026-02-13-glm-4.7-flash-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-13-glm-4.7-flash-workers-ai/</guid><description>&lt;p&gt;We&apos;re excited to announce &lt;strong&gt;GLM-4.7-Flash&lt;/strong&gt; on Workers AI, a fast and efficient text generation model optimized for multilingual dialogue and instruction-following tasks, along with the brand-new &lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/tanstack-ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;@cloudflare/tanstack-ai&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; package and &lt;a href=&quot;https://www.npmjs.com/package/workers-ai-provider&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;workers-ai-provider v3.1.1&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can now run AI agents entirely on Cloudflare. With GLM-4.7-Flash&apos;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;glm-47-flash--multilingual-text-generation-model&quot;&gt;GLM-4.7-Flash — Multilingual Text Generation Model&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#glm-47-flash--multilingual-text-generation-model&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/glm-4.7-flash/&quot;&gt;&lt;code&gt;@cf/zai-org/glm-4.7-flash&lt;/code&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Features and Use Cases:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-turn Tool Calling for Agents&lt;/strong&gt;: Build AI agents that can call functions and tools across multiple conversation turns&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multilingual Support&lt;/strong&gt;: Built to handle content generation in multiple languages effectively&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Large Context Window&lt;/strong&gt;: 131,072 tokens for long-form writing, complex reasoning, and processing long documents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fast Inference&lt;/strong&gt;: Optimized for low-latency responses in chatbots and virtual assistants&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instruction Following&lt;/strong&gt;: Excellent at following complex instructions for code generation and structured tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use GLM-4.7-Flash through the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/bindings/&quot;&gt;Workers AI binding&lt;/a&gt; (&lt;code&gt;env.AI.run()&lt;/code&gt;), the REST API at &lt;code&gt;/run&lt;/code&gt; or &lt;code&gt;/v1/chat/completions&lt;/code&gt;, &lt;a href=&quot;https://developers.cloudflare.com/ai-gateway/&quot;&gt;AI Gateway&lt;/a&gt;, or via &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/ai-sdk/&quot;&gt;workers-ai-provider&lt;/a&gt; for the Vercel AI SDK.&lt;/p&gt;
&lt;p&gt;Pricing is available on the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/glm-4.7-flash/&quot;&gt;model page&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing page&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cloudflaretanstack-ai-v011--tanstack-ai-adapters-for-workers-ai-and-ai-gateway&quot;&gt;@cloudflare/tanstack-ai v0.1.1 — TanStack AI adapters for Workers AI and AI Gateway&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cloudflaretanstack-ai-v011--tanstack-ai-adapters-for-workers-ai-and-ai-gateway&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;We&apos;ve released &lt;code&gt;@cloudflare/tanstack-ai&lt;/code&gt;, a new package that brings Workers AI and AI Gateway support to &lt;a href=&quot;https://tanstack.com/ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TanStack AI&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. This provides a framework-agnostic alternative for developers who prefer TanStack&apos;s approach to building AI applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workers AI adapters&lt;/strong&gt; support four configuration modes — plain binding (&lt;code&gt;env.AI&lt;/code&gt;), plain REST, AI Gateway binding (&lt;code&gt;env.AI.gateway(id)&lt;/code&gt;), and AI Gateway REST — across all capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chat&lt;/strong&gt; (&lt;code&gt;createWorkersAiChat&lt;/code&gt;) — Streaming chat completions with tool calling, structured output, and reasoning text streaming.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Image generation&lt;/strong&gt; (&lt;code&gt;createWorkersAiImage&lt;/code&gt;) — Text-to-image models.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transcription&lt;/strong&gt; (&lt;code&gt;createWorkersAiTranscription&lt;/code&gt;) — Speech-to-text.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Text-to-speech&lt;/strong&gt; (&lt;code&gt;createWorkersAiTts&lt;/code&gt;) — Audio generation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Summarization&lt;/strong&gt; (&lt;code&gt;createWorkersAiSummarize&lt;/code&gt;) — Text summarization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;AI Gateway adapters&lt;/strong&gt; route requests from third-party providers — OpenAI, Anthropic, Gemini, Grok, and OpenRouter — through Cloudflare AI Gateway for caching, rate limiting, and unified billing.&lt;/p&gt;
&lt;p&gt;To get started:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/tanstack-ai&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @tanstack/ai&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;workers-ai-provider-v311--transcription-speech-reranking-and-reliability&quot;&gt;workers-ai-provider v3.1.1 — transcription, speech, reranking, and reliability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#workers-ai-provider-v311--transcription-speech-reranking-and-reliability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The Workers AI provider for the &lt;a href=&quot;https://ai-sdk.dev&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Vercel AI SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; now supports three new capabilities beyond chat and image generation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Transcription&lt;/strong&gt; (&lt;code&gt;provider.transcription(model)&lt;/code&gt;) — Speech-to-text with automatic handling of model-specific input formats across binding and REST paths.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Text-to-speech&lt;/strong&gt; (&lt;code&gt;provider.speech(model)&lt;/code&gt;) — Audio generation with support for voice and speed options.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reranking&lt;/strong&gt; (&lt;code&gt;provider.reranking(model)&lt;/code&gt;) — Document reranking for RAG pipelines and search result ordering.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createWorkersAI } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;workers-ai-provider&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	experimental_transcribe,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	experimental_generateSpeech,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	rerank,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; workersai&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createWorkersAI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ binding: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; transcript&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; experimental_transcribe&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model: workersai.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;transcription&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/openai/whisper-large-v3-turbo&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	audio: audioData,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	mediaType: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;audio/wav&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; speech&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; experimental_generateSpeech&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model: workersai.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;speech&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/deepgram/aura-1&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	text: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Hello world&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	voice: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;asteria&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; ranked&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; rerank&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model: workersai.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;reranking&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/baai/bge-reranker-base&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	query: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;What is machine learning?&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	documents: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ML is a branch of AI.&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;The weather is sunny.&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;This release also includes a comprehensive reliability overhaul (v3.0.5):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fixed streaming&lt;/strong&gt; — Responses now stream token-by-token instead of buffering all chunks, using a proper &lt;code&gt;TransformStream&lt;/code&gt; pipeline with backpressure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fixed tool calling&lt;/strong&gt; — 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Premature stream termination detection&lt;/strong&gt; — Streams that end unexpectedly now report &lt;code&gt;finishReason: &quot;error&quot;&lt;/code&gt; instead of silently reporting &lt;code&gt;&quot;stop&quot;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Search support&lt;/strong&gt; — Added &lt;code&gt;createAISearch&lt;/code&gt; as the canonical export (renamed from AutoRAG). &lt;code&gt;createAutoRAG&lt;/code&gt; still works with a deprecation warning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To upgrade:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workers-ai-provider@latest&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ai&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;resources&quot;&gt;Resources&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/@cloudflare/tanstack-ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;@cloudflare/tanstack-ai on npm&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/workers-ai-provider&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;workers-ai-provider on npm&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GitHub repository&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Agents</category><category>Workers AI</category></item><item><title>Workers VPC - Origin CA certificate support for Workers VPC</title><link>https://developers.cloudflare.com/changelog/post/2026-02-13-origin-ca-certificate-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-13-origin-ca-certificate-support/</guid><description>&lt;p&gt;Workers VPC now supports &lt;a href=&quot;https://developers.cloudflare.com/ssl/origin-configuration/origin-ca/&quot;&gt;Cloudflare Origin CA certificates&lt;/a&gt; when connecting to your private services over HTTPS. Previously, Workers VPC only trusted certificates issued by publicly trusted certificate authorities (for example, Let&apos;s Encrypt, DigiCert).&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;https&lt;/code&gt; scheme. This is useful for encrypting traffic between the tunnel and your service without needing to provision certificates from a public CA.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/configuration/vpc-services/#supported-tls-certificates&quot;&gt;Supported TLS certificates&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate><product>Workers VPC</product><category>Workers VPC</category></item><item><title>Cloudflare WAN - Anycast IPs displayed on the dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-02-12-anycast-ips-on-dashboard/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-12-anycast-ips-on-dashboard/</guid><description>&lt;p&gt;Cloudflare WAN now displays your Anycast IP addresses directly in the dashboard when you configure IPsec or GRE tunnels.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;No action is required. All Cloudflare WAN customers can see their Anycast IPs in the tunnel configuration form automatically.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/how-to/configure-tunnel-endpoints/&quot;&gt;Configure tunnel endpoints&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate><product>Cloudflare WAN</product><category>Cloudflare WAN</category></item><item><title>Cloudflare Fundamentals - Introducing Markdown for Agents</title><link>https://developers.cloudflare.com/changelog/post/2026-02-12-markdown-for-agents/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-12-markdown-for-agents/</guid><description>&lt;p&gt;Cloudflare&apos;s network now supports real-time content conversion at the source, for enabled zones using &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Content_negotiation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;content negotiation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; headers. When AI systems request pages from any website that uses Cloudflare and has Markdown for Agents enabled, they can express the preference for &lt;code&gt;text/markdown&lt;/code&gt; in the request: our network will automatically and efficiently convert the HTML to markdown, when possible, on the fly.&lt;/p&gt;
&lt;p&gt;Here is a curl example with the &lt;code&gt;Accept&lt;/code&gt; negotiation header requesting this page from our developer documentation:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Accept: text/markdown&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;The response to this request is now formatted in markdown:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;http&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;http&quot; data-nb-lang=&quot;http&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;HTTP/2 &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;200&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-17hn0y&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Wed, 11 Feb 2026 11:44:48 GMT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-17hn0y&quot;&gt;content-type&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; text/markdown; charset=utf-8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-17hn0y&quot;&gt;content-length&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 2899&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-17hn0y&quot;&gt;vary&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; accept&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-17hn0y&quot;&gt;x-markdown-tokens&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 725&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-17hn0y&quot;&gt;content-signal&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ai-train=yes, search=yes, ai-input=yes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-17hn0y&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Markdown for Agents · Cloudflare Agents docs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;## What is Markdown for Agents&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;Markdown has quickly become the lingua franca for agents and AI systems&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;as a whole. The format’s explicit structure makes it ideal for AI processing,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ultimately resulting in better results while minimizing token waste.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Refer to our &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/reference/markdown-for-agents/&quot;&gt;developer documentation&lt;/a&gt; and our &lt;a href=&quot;https://blog.cloudflare.com/markdown-for-agents/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;blog announcement&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; for more details.&lt;/p&gt;</description><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Radar - Content Type Dimension for AI Bots in Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2026-02-12-radar-ai-bots-content-type/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-12-radar-ai-bots-content-type/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; now includes content type insights for AI bot and crawler traffic. The new &lt;code&gt;content_type&lt;/code&gt; dimension and filter shows the distribution of content types returned to AI crawlers, grouped by MIME type category.&lt;/p&gt;
&lt;p&gt;The content type dimension and filter are available via the following API endpoints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/ai/subresources/bots/methods/summary_v2/&quot;&gt;&lt;code&gt;/ai/bots/summary/content_type&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/ai/subresources/bots/methods/timeseries_groups/&quot;&gt;&lt;code&gt;/ai/bots/timeseries_groups/content_type&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Content type categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTML&lt;/strong&gt; - Web pages (&lt;code&gt;text/html&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Images&lt;/strong&gt; - All image formats (&lt;code&gt;image/*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSON&lt;/strong&gt; - JSON data and API responses (&lt;code&gt;application/json&lt;/code&gt;, &lt;code&gt;*+json&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript&lt;/strong&gt; - Scripts (&lt;code&gt;application/javascript&lt;/code&gt;, &lt;code&gt;text/javascript&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSS&lt;/strong&gt; - Stylesheets (&lt;code&gt;text/css&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plain Text&lt;/strong&gt; - Unformatted text (&lt;code&gt;text/plain&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fonts&lt;/strong&gt; - Web fonts (&lt;code&gt;font/*&lt;/code&gt;, &lt;code&gt;application/font-*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;XML&lt;/strong&gt; - XML documents and feeds (&lt;code&gt;text/xml&lt;/code&gt;, &lt;code&gt;application/xml&lt;/code&gt;, &lt;code&gt;application/rss+xml&lt;/code&gt;, &lt;code&gt;application/atom+xml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;YAML&lt;/strong&gt; - Configuration files (&lt;code&gt;text/yaml&lt;/code&gt;, &lt;code&gt;application/yaml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Video&lt;/strong&gt; - Video content and streaming (&lt;code&gt;video/*&lt;/code&gt;, &lt;code&gt;application/ogg&lt;/code&gt;, &lt;code&gt;*mpegurl&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audio&lt;/strong&gt; - Audio content (&lt;code&gt;audio/*&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markdown&lt;/strong&gt; - Markdown documents (&lt;code&gt;text/markdown&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documents&lt;/strong&gt; - PDFs, Office documents, ePub, CSV (&lt;code&gt;application/pdf&lt;/code&gt;, &lt;code&gt;application/msword&lt;/code&gt;, &lt;code&gt;text/csv&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Binary&lt;/strong&gt; - Executables, archives, WebAssembly (&lt;code&gt;application/octet-stream&lt;/code&gt;, &lt;code&gt;application/zip&lt;/code&gt;, &lt;code&gt;application/wasm&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Serialization&lt;/strong&gt; - Binary API formats (&lt;code&gt;application/protobuf&lt;/code&gt;, &lt;code&gt;application/grpc&lt;/code&gt;, &lt;code&gt;application/msgpack&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Other&lt;/strong&gt; - All other content types&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, individual &lt;a href=&quot;https://radar.cloudflare.com/bots/directory/gptbot&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;bot information pages&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; now display content type distribution for AI crawlers that exist in both the Verified Bots and AI Bots datasets.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=874,format=webp/_astro/ai-bots-content-type.B7xP9p4S.png&quot; alt=&quot;Screenshot of the Content Type Distribution chart on the AI Insights page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;874&quot;&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://radar.cloudflare.com/ai-insights#content-type&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI Insights page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to explore the data.&lt;/p&gt;</description><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Security Center - Enhanced Logo Matching for Brand Protection</title><link>https://developers.cloudflare.com/changelog/post/2026-02-12-brand-protection-logo-matching-percentage-selector/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-12-brand-protection-logo-matching-percentage-selector/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Configurable match thresholds&lt;/strong&gt;: Users can set a minimum match score (starting at 75%) when creating a logo query to capture subtle variations or high-quality impersonations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visual match scores&lt;/strong&gt;: Allow users to see the exact percentage of the match directly in the results table, highlighted with color-coded lozenges to indicate severity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Direct logo previews&lt;/strong&gt;: Available in the Cloudflare dashboard — similar to string matches — to verify infringements at a glance.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-benefits&quot;&gt;Key benefits&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-benefits&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Expose sophisticated impersonators&lt;/strong&gt; who use slightly altered logos to bypass basic detection filters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Faster triage&lt;/strong&gt; of the most relevant threats immediately using visual indicators, reducing the time spent manually reviewing matches.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ready to protect your visual identity? Learn more in our &lt;a href=&quot;https://developers.cloudflare.com/security-center/brand-protection/&quot;&gt;Brand Protection documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Cloudflare Fundamentals, Terraform - Terraform v5.17.0 now available</title><link>https://developers.cloudflare.com/changelog/post/2026-02-12-terraform-v5.17.0-provider/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-12-terraform-v5.17.0-provider/</guid><description>&lt;p&gt;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 &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/5774&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2-3 week cadence&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; for releasing targeted improvements,
demonstrating our commitment to stability and reliability.&lt;/p&gt;
&lt;p&gt;With the help of the community, we have a growing number of resources that we
have marked as &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;stable&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, with that list continuing to grow with every release.
The most used &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;resources&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Thank you for continuing to raise issues. They make our provider stronger and
help us build products that reflect your needs.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;features&quot;&gt;Features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ai_search_instance:&lt;/strong&gt; add data source for querying AI Search instances&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ai_search_token:&lt;/strong&gt; add data source for querying AI Search tokens&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;account:&lt;/strong&gt; add support for tenant unit management with new &lt;code&gt;unit&lt;/code&gt; field&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;account:&lt;/strong&gt; add automatic mapping from &lt;code&gt;managed_by.parent_org_id&lt;/code&gt; to &lt;code&gt;unit.id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;authenticated_origin_pulls_certificate:&lt;/strong&gt; add data source for querying authenticated origin pull certificates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;authenticated_origin_pulls_hostname_certificate:&lt;/strong&gt; add data source for querying hostname-specific authenticated origin pull certificates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;authenticated_origin_pulls_settings:&lt;/strong&gt; add data source for querying authenticated origin pull settings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_kv:&lt;/strong&gt; add &lt;code&gt;value&lt;/code&gt; field to data source to retrieve KV values directly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_script:&lt;/strong&gt; add &lt;code&gt;script&lt;/code&gt; field to data source to retrieve script content&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_script:&lt;/strong&gt; add support for &lt;code&gt;simple&lt;/code&gt; rate limit binding&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_script:&lt;/strong&gt; add support for targeted placement mode with &lt;code&gt;placement.target&lt;/code&gt; array for specifying placement targets (region, hostname, host)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_script:&lt;/strong&gt; add &lt;code&gt;placement_mode&lt;/code&gt; and &lt;code&gt;placement_status&lt;/code&gt; computed fields&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_dex_test:&lt;/strong&gt; add data source with filter support for finding specific tests&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_dlp_predefined_profile:&lt;/strong&gt; add &lt;code&gt;enabled_entries&lt;/code&gt; field for flexible entry management&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;bug-fixes&quot;&gt;Bug Fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bug-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;account:&lt;/strong&gt; map &lt;code&gt;managed_by.parent_org_id&lt;/code&gt; to &lt;code&gt;unit.id&lt;/code&gt; in unmarshall and add acceptance tests&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;authenticated_origin_pulls_certificate:&lt;/strong&gt; add certificate normalization to prevent drift&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;authenticated_origin_pulls:&lt;/strong&gt; handle array response and implement full lifecycle&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;authenticated_origin_pulls_hostname_certificate:&lt;/strong&gt; fix resource and tests&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudforce_one_request_message:&lt;/strong&gt; use correct &lt;code&gt;request_id&lt;/code&gt; field instead of &lt;code&gt;id&lt;/code&gt; in API calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dns_zone_transfers_incoming:&lt;/strong&gt; use correct &lt;code&gt;zone_id&lt;/code&gt; field instead of &lt;code&gt;id&lt;/code&gt; in API calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dns_zone_transfers_outgoing:&lt;/strong&gt; use correct &lt;code&gt;zone_id&lt;/code&gt; field instead of &lt;code&gt;id&lt;/code&gt; in API calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;email_routing_settings:&lt;/strong&gt; use correct &lt;code&gt;zone_id&lt;/code&gt; field instead of &lt;code&gt;id&lt;/code&gt; in API calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hyperdrive_config:&lt;/strong&gt; add proper handling for write-only fields to prevent state drift&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hyperdrive_config:&lt;/strong&gt; add normalization for empty &lt;code&gt;mtls&lt;/code&gt; objects to prevent unnecessary diffs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;magic_network_monitoring_rule:&lt;/strong&gt; use correct &lt;code&gt;account_id&lt;/code&gt; field instead of &lt;code&gt;id&lt;/code&gt; in API calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mtls_certificates:&lt;/strong&gt; fix resource and test&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pages_project:&lt;/strong&gt; revert build_config to computed optional&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;stream_key:&lt;/strong&gt; use correct &lt;code&gt;account_id&lt;/code&gt; field instead of &lt;code&gt;id&lt;/code&gt; in API calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;total_tls:&lt;/strong&gt; use upsert pattern for singleton zone setting&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;waiting_room_rules:&lt;/strong&gt; use correct &lt;code&gt;waiting_room_id&lt;/code&gt; field instead of &lt;code&gt;id&lt;/code&gt; in API calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_script:&lt;/strong&gt; add support for placement mode/status&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_access_application:&lt;/strong&gt; update v4 version on migration tests&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_device_posture_rule:&lt;/strong&gt; update tests to match API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_dlp_integration_entry:&lt;/strong&gt; use correct &lt;code&gt;entry_id&lt;/code&gt; field instead of &lt;code&gt;id&lt;/code&gt; in API calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_dlp_predefined_entry:&lt;/strong&gt; use correct &lt;code&gt;entry_id&lt;/code&gt; field instead of &lt;code&gt;id&lt;/code&gt; in API calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_organization:&lt;/strong&gt; fix plan issues&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;chores&quot;&gt;Chores&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#chores&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;add state upgraders to 95+ resources to lay the foundation for replacing Grit
(still under active development)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;certificate_pack:&lt;/strong&gt; add state migration handler for SDKv2 to Framework conversion&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;custom_hostname_fallback_origin:&lt;/strong&gt; add comprehensive lifecycle test and migration support&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dns_record:&lt;/strong&gt; add state migration handler for SDKv2 to Framework conversion&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;leaked_credential_check:&lt;/strong&gt; add import functionality and tests&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;load_balancer_pool:&lt;/strong&gt; add state migration handler with detection for v4 vs v5 format&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pages_project:&lt;/strong&gt; add state migration handlers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tiered_cache:&lt;/strong&gt; add state migration handlers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_dlp_predefined_profile:&lt;/strong&gt; deprecate &lt;code&gt;entries&lt;/code&gt; field in favor of &lt;code&gt;enabled_entries&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;for-more-information&quot;&gt;For more information&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#for-more-information&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Terraform Provider&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/terraform/&quot;&gt;Documentation on using Terraform with Cloudflare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;List of stabilized resources&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>Terraform</category></item><item><title>Cloudflare One Appliance, Cloudflare One, Cloudflare WAN - Post-quantum encryption support for Cloudflare One Appliance</title><link>https://developers.cloudflare.com/changelog/post/2026-02-11-appliance-post-quantum-encryption/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-11-appliance-post-quantum-encryption/</guid><description>&lt;p&gt;Cloudflare One Appliance version 2026.2.0 adds &lt;a href=&quot;https://developers.cloudflare.com/ssl/post-quantum-cryptography/&quot;&gt;post-quantum encryption&lt;/a&gt; support using hybrid ML-KEM (Module-Lattice-Based Key-Encapsulation Mechanism).&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;This upgrade deploys automatically to all appliances during their configured interrupt windows with no manual action required.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/&quot;&gt;Cloudflare One Appliance&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><product>Cloudflare One Appliance</product><category>Cloudflare One Appliance</category><category>Cloudflare One</category><category>Cloudflare WAN</category></item><item><title>Workers - Workers are no longer limited to 1000 subrequests</title><link>https://developers.cloudflare.com/changelog/post/2026-02-11-subrequests-limit/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-11-subrequests-limit/</guid><description>
&lt;p&gt;Workers no longer have a limit of 1000 subrequests per invocation, allowing you to make more &lt;code&gt;fetch()&lt;/code&gt; calls or requests
to Cloudflare services on every incoming request. This is especially important for long-running Workers requests, such as
open websockets on &lt;a href=&quot;https://developers.cloudflare.com/durable-objects&quot;&gt;Durable Objects&lt;/a&gt; or long-running &lt;a href=&quot;https://developers.cloudflare.com/workflows&quot;&gt;Workflows&lt;/a&gt;, as these could often exceed this limit and error.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;subrequests&lt;/code&gt; limit in your Wrangler configuration file.&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;limits&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;subrequests&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;50000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;limits&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;subrequests = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;50_000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;Workers on the free plan remain limited to 50 external subrequests and 1000 subrequests to Cloudflare services per invocation.&lt;/p&gt;
&lt;p&gt;To protect against runaway code or unexpected costs, you can also set a lower limit for both subrequests and CPU usage.&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;limits&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;subrequests&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;cpu_ms&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;limits&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;subrequests = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;cpu_ms = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1_000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/#limits&quot;&gt;Wrangler configuration documentation for limits&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/limits/#subrequests&quot;&gt;subrequest limits&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Improved React Server Components support in the Cloudflare Vite plugin</title><link>https://developers.cloudflare.com/changelog/post/2026-02-11-vite-plugin-child-environments/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-11-vite-plugin-child-environments/</guid><description>&lt;p&gt;The Cloudflare Vite plugin now integrates seamlessly &lt;a href=&quot;https://github.com/vitejs/vite-plugin-react/tree/main/packages/plugin-rsc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;@vitejs/plugin-rsc&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, the official Vite plugin for &lt;a href=&quot;https://react.dev/reference/rsc/server-components&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;React Server Components&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;childEnvironments&lt;/code&gt; 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:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;vite.config.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineConfig&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	plugins: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		cloudflare&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			viteEnvironment: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;rsc&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				childEnvironments: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ssr&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;code&gt;@vitejs/plugin-rsc&lt;/code&gt; provides the lower level functionality that frameworks, such as &lt;a href=&quot;https://reactrouter.com/how-to/react-server-components&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;React Router&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, build upon.
The GitHub repository includes a &lt;a href=&quot;https://github.com/vitejs/vite-plugin-react/tree/f066114c3e6bf18f5209ff3d3ef6bf1ab46d3866/packages/plugin-rsc/examples/starter-cf-single&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;basic Cloudflare example&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>WAF - WAF Release - 2026-02-10</title><link>https://developers.cloudflare.com/changelog/post/2026-02-10-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-10-waf-release/</guid><description>
&lt;p&gt;This week’s release changes the rule action from BLOCK to Disabled for Anomaly:Header:User-Agent - Fake Google Bot.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ce11be543594412bb4bb92516aa0bef8&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...6aa0bef8&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Anomaly:Header:User-Agent - Fake Google Bot&lt;/td&gt;&lt;td&gt;Enabled&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;We are changing the action for this rule from BLOCK to Disabled&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Agents, Workers - Agents SDK v0.4.0: Readonly connections, MCP security improvements, x402 v2 migration, and custom MCP OAuth providers</title><link>https://developers.cloudflare.com/changelog/post/2026-02-09-agents-sdk-v0.4.0/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-09-agents-sdk-v0.4.0/</guid><description>
&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; brings readonly connections, MCP protocol and security improvements, x402 payment protocol v2 migration, and the ability to customize OAuth for MCP server connections.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;readonly-connections&quot;&gt;Readonly connections&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#readonly-connections&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;New hooks: &lt;code&gt;shouldConnectionBeReadonly&lt;/code&gt;, &lt;code&gt;setConnectionReadonly&lt;/code&gt;, &lt;code&gt;isConnectionReadonly&lt;/code&gt;. Readonly connections block both client-side &lt;code&gt;setState()&lt;/code&gt; and mutating &lt;code&gt;@callable()&lt;/code&gt; methods, and the readonly flag survives hibernation.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	shouldConnectionBeReadonly&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;connection&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Make spectators readonly&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; connection.url.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;spectator&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	shouldConnectionBeReadonly&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;connection&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Make spectators readonly&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; connection.url.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;spectator&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;custom-mcp-oauth-providers&quot;&gt;Custom MCP OAuth providers&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#custom-mcp-oauth-providers&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The new &lt;code&gt;createMcpOAuthProvider&lt;/code&gt; method on the &lt;code&gt;Agent&lt;/code&gt; 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.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	createMcpOAuthProvider&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;callbackUrl&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyCustomOAuthProvider&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.storage, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.name, callbackUrl);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	createMcpOAuthProvider&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;callbackUrl&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentMcpOAuthProvider&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyCustomOAuthProvider&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.ctx.storage, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.name, callbackUrl);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;mcp-sdk-upgrade-to-1260&quot;&gt;MCP SDK upgrade to 1.26.0&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#mcp-sdk-upgrade-to-1260&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Upgraded the MCP SDK to 1.26.0 to prevent cross-client response leakage. Stateless MCP Servers should now create a new &lt;code&gt;McpServer&lt;/code&gt; 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 &lt;code&gt;McpServer&lt;/code&gt; instance as a global variable.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;mcp-oauth-callback-url-security-fix&quot;&gt;MCP OAuth callback URL security fix&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#mcp-oauth-callback-url-security-fix&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Added &lt;code&gt;callbackPath&lt;/code&gt; option to &lt;code&gt;addMcpServer&lt;/code&gt; to prevent instance name leakage in MCP OAuth callback URLs. When &lt;code&gt;sendIdentityOnConnect&lt;/code&gt; is &lt;code&gt;false&lt;/code&gt;, &lt;code&gt;callbackPath&lt;/code&gt; 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 &lt;code&gt;state&lt;/code&gt; parameter instead of a loose &lt;code&gt;/callback&lt;/code&gt; URL substring check, enabling custom callback paths.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;deprecate-onstateupdate-in-favor-of-onstatechanged&quot;&gt;Deprecate &lt;code&gt;onStateUpdate&lt;/code&gt; in favor of &lt;code&gt;onStateChanged&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#deprecate-onstateupdate-in-favor-of-onstatechanged&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;onStateChanged&lt;/code&gt; is a drop-in rename of &lt;code&gt;onStateUpdate&lt;/code&gt; (same signature, same behavior). &lt;code&gt;onStateUpdate&lt;/code&gt; still works but emits a one-time console warning per class. &lt;code&gt;validateStateChange&lt;/code&gt; rejections now propagate a &lt;code&gt;CF_AGENT_STATE_ERROR&lt;/code&gt; message back to the client.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;x402-v2-migration&quot;&gt;x402 v2 migration&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#x402-v2-migration&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Migrated the x402 MCP payment integration from the legacy &lt;code&gt;x402&lt;/code&gt; package to &lt;code&gt;@x402/core&lt;/code&gt; and &lt;code&gt;@x402/evm&lt;/code&gt; v2.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Breaking changes for x402 users:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Peer dependencies changed: replace &lt;code&gt;x402&lt;/code&gt; with &lt;code&gt;@x402/core&lt;/code&gt; and &lt;code&gt;@x402/evm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PaymentRequirements&lt;/code&gt; type now uses v2 fields (e.g. &lt;code&gt;amount&lt;/code&gt; instead of &lt;code&gt;maxAmountRequired&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X402ClientConfig.account&lt;/code&gt; type changed from &lt;code&gt;viem.Account&lt;/code&gt; to &lt;code&gt;ClientEvmSigner&lt;/code&gt; (structurally compatible with &lt;code&gt;privateKeyToAccount()&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; uninstall&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; x402&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @x402/core&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @x402/evm&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Network identifiers now accept both legacy names and CAIP-2 format:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Legacy name (auto-converted)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	network&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;base-sepolia&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// CAIP-2 format (preferred)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	network&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;eip155:84532&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Other x402 changes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;X402ClientConfig.network&lt;/code&gt; is now optional — the client auto-selects from available payment requirements&lt;/li&gt;
&lt;li&gt;Server-side lazy initialization: facilitator connection is deferred until the first paid tool invocation&lt;/li&gt;
&lt;li&gt;Payment tokens support both v2 (&lt;code&gt;PAYMENT-SIGNATURE&lt;/code&gt;) and v1 (&lt;code&gt;X-PAYMENT&lt;/code&gt;) HTTP headers&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;normalizeNetwork&lt;/code&gt; export for converting legacy network names to CAIP-2 format&lt;/li&gt;
&lt;li&gt;Re-exports &lt;code&gt;PaymentRequirements&lt;/code&gt;, &lt;code&gt;PaymentRequired&lt;/code&gt;, &lt;code&gt;Network&lt;/code&gt;, &lt;code&gt;FacilitatorConfig&lt;/code&gt;, and &lt;code&gt;ClientEvmSigner&lt;/code&gt; from &lt;code&gt;agents/x402&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;other-improvements&quot;&gt;Other improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#other-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Fix &lt;code&gt;useAgent&lt;/code&gt; and &lt;code&gt;AgentClient&lt;/code&gt; crashing when using &lt;code&gt;basePath&lt;/code&gt; routing&lt;/li&gt;
&lt;li&gt;CORS handling delegated to partyserver&apos;s native support (simpler, more reliable)&lt;/li&gt;
&lt;li&gt;Client-side &lt;code&gt;onStateUpdateError&lt;/code&gt; callback for handling rejected state updates&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; agents@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Agents - Interactive browser terminals in Sandboxes</title><link>https://developers.cloudflare.com/changelog/post/2026-02-09-pty-terminal-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-09-pty-terminal-support/</guid><description>
&lt;p&gt;The &lt;a href=&quot;https://github.com/cloudflare/sandbox-sdk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Sandbox SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; now supports PTY (pseudo-terminal) passthrough, enabling browser-based terminal UIs to connect to sandbox shells via WebSocket.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;sandboxterminalrequest&quot;&gt;&lt;code&gt;sandbox.terminal(request)&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#sandboxterminalrequest&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The new &lt;code&gt;terminal()&lt;/code&gt; method proxies a WebSocket upgrade to the container&apos;s PTY endpoint, with output buffering for replay on reconnect.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Worker: proxy WebSocket to container terminal&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;terminal&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, { cols: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;80&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, rows: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;24&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Worker: proxy WebSocket to container terminal&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;terminal&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request, { cols: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;80&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, rows: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;24&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;multiple-terminals-per-sandbox&quot;&gt;Multiple terminals per sandbox&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#multiple-terminals-per-sandbox&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Multiple isolated terminals in the same sandbox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; dev&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getSession&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;dev&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; dev.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;terminal&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Multiple isolated terminals in the same sandbox&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; dev&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sandbox.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getSession&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;dev&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; dev.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;terminal&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;xtermjs-addon&quot;&gt;xterm.js addon&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#xtermjs-addon&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The new &lt;code&gt;@cloudflare/sandbox/xterm&lt;/code&gt; export provides a &lt;code&gt;SandboxAddon&lt;/code&gt; for &lt;a href=&quot;https://xtermjs.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;xterm.js&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; with automatic reconnection (exponential backoff + jitter), buffered output replay, and resize forwarding.&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { SandboxAddon } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/sandbox/xterm&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; addon&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; SandboxAddon&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	getWebSocketUrl&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;sandboxId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;origin&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;		`${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;origin&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}/ws/terminal?id=${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;sandboxId&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onStateChange&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; updateUI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(state),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;terminal.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;loadAddon&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(addon);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;addon.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;connect&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ sandboxId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { SandboxAddon } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/sandbox/xterm&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; addon&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; SandboxAddon&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	getWebSocketUrl&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;sandboxId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;origin&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;		`${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;origin&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}/ws/terminal?id=${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;sandboxId&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onStateChange&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; updateUI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(state),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;terminal.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;loadAddon&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(addon);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;addon.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;connect&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ sandboxId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-sandbox&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @cloudflare/sandbox@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category></item><item><title>AI Crawl Control - Analytics enhancements</title><link>https://developers.cloudflare.com/changelog/post/2026-02-09-analytics-enhancements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-09-analytics-enhancements/</guid><description>&lt;p&gt;AI Crawl Control metrics have been enhanced with new views, improved filtering, and better data visualization.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2256,height=1262,format=webp/_astro/ai-crawl-control-path-patterns.0xT_lucE.png&quot; alt=&quot;AI Crawl Control path patterns&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2256&quot; height=&quot;1262&quot;&gt;
&lt;p&gt;&lt;strong&gt;Path pattern grouping&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the &lt;strong&gt;Metrics&lt;/strong&gt; tab &amp;gt; &lt;strong&gt;Most popular paths&lt;/strong&gt; table, use the new &lt;strong&gt;Patterns&lt;/strong&gt; tab that groups requests by URI pattern (&lt;code&gt;/blog/*&lt;/code&gt;, &lt;code&gt;/api/v1/*&lt;/code&gt;, &lt;code&gt;/docs/*&lt;/code&gt;) to identify which site areas crawlers target most. Refer to the screenshot above.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Enhanced referral analytics&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Destination patterns show which site areas receive AI-driven referral traffic.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Metrics&lt;/strong&gt; tab, a new &lt;strong&gt;Referrals over time&lt;/strong&gt; chart shows trends by operator or source.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Data transfer metrics&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the &lt;strong&gt;Metrics&lt;/strong&gt; tab &amp;gt; &lt;strong&gt;Allowed requests over time&lt;/strong&gt; chart, toggle &lt;strong&gt;Bytes&lt;/strong&gt; to show bandwidth consumption.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Crawlers&lt;/strong&gt; tab, a new &lt;strong&gt;Bytes Transferred&lt;/strong&gt; column shows bandwidth per crawler.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Image exports&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Export charts and tables as images for reports and presentations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/features/analyze-ai-traffic/&quot;&gt;analyzing AI traffic&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><product>AI Crawl Control</product><category>AI Crawl Control</category></item><item><title>AI Search - AI Search now with more granular controls over indexing</title><link>https://developers.cloudflare.com/changelog/post/2026-02-09-indexing-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-09-indexing-improvements/</guid><description>&lt;p&gt;Get your content updates into &lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; faster and avoid a full rescan when you do not need it.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;reindex-individual-files-without-a-full-sync&quot;&gt;Reindex individual files without a full sync&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#reindex-individual-files-without-a-full-sync&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Updated a file or need to retry one that errored? When you know exactly which file changed, you can now &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/indexing/syncing/#controls&quot;&gt;reindex it directly&lt;/a&gt; instead of rescanning your entire data source.&lt;/p&gt;
&lt;p&gt;Go to &lt;strong&gt;Overview&lt;/strong&gt; &amp;gt; &lt;strong&gt;Indexed Items&lt;/strong&gt; and select the sync icon next to any file to reindex it immediately.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2118,height=782,format=webp/_astro/individual-file-indexing.CQgoIj85.png&quot; alt=&quot;Sync individual files from Indexed Items&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2118&quot; height=&quot;782&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;crawl-only-the-sitemap-you-need&quot;&gt;Crawl only the sitemap you need&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#crawl-only-the-sitemap-you-need&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;By default, AI Search crawls all sitemaps listed in your &lt;code&gt;robots.txt&lt;/code&gt;, up to the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/platform/limits-pricing/#limits&quot;&gt;maximum files per index limit&lt;/a&gt;. If your site has multiple sitemaps but you only want to index a specific set, you can now &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/website/parse-types/#specific-sitemap&quot;&gt;specify a single sitemap URL&lt;/a&gt; to limit what the crawler visits.&lt;/p&gt;
&lt;p&gt;For example, if your &lt;code&gt;robots.txt&lt;/code&gt; lists both &lt;code&gt;blog-sitemap.xml&lt;/code&gt; and &lt;code&gt;docs-sitemap.xml&lt;/code&gt;, you can specify just &lt;code&gt;https://example.com/docs-sitemap.xml&lt;/code&gt; to index only your documentation.&lt;/p&gt;
&lt;p&gt;Configure your selection anytime in &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Parsing options&lt;/strong&gt; &amp;gt; &lt;strong&gt;Specific sitemaps&lt;/strong&gt;, then trigger a sync to apply the changes.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1973,height=387,format=webp/_astro/specify-sitemap.pLCkwmJ-.png&quot; alt=&quot;Specify a sitemap in Parsinh options&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1973&quot; height=&quot;387&quot;&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/indexing/syncing/#controls&quot;&gt;indexing controls&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/website/parse-types/#specific-sitemap&quot;&gt;website crawling configuration&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Log Explorer - Tabs and pivots</title><link>https://developers.cloudflare.com/changelog/post/2026-02-09-tabs-and-pivots/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-09-tabs-and-pivots/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-capabilities&quot;&gt;Key capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multiple tabs:&lt;/strong&gt; Open and switch between multiple query tabs to compare results across different datasets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quick filtering:&lt;/strong&gt; Select the filter button from query results to add a value as a filter to your current query.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pivot to new tab:&lt;/strong&gt; Use Cmd + click on the filter button to start a new query tab with that filter applied.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preserved progress:&lt;/strong&gt; Your query progress is preserved on each tab if you navigate away and return.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/log-explorer/&quot;&gt;Log Explorer documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><product>Log Explorer</product><category>Log Explorer</category></item><item><title>R2 SQL - R2 SQL now supports approximate aggregation functions</title><link>https://developers.cloudflare.com/changelog/post/2026-02-09-approximate-aggregation-functions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-09-approximate-aggregation-functions/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-functions&quot;&gt;New functions&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-functions&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;APPROX_PERCENTILE_CONT(column, percentile)&lt;/code&gt; — Returns the approximate value at a given percentile (0.0 to 1.0). Works on integer and decimal columns.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APPROX_PERCENTILE_CONT_WITH_WEIGHT(column, weight, percentile)&lt;/code&gt; — Weighted percentile calculation where each row contributes proportionally to its weight column value.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APPROX_MEDIAN(column)&lt;/code&gt; — Returns the approximate median. Equivalent to &lt;code&gt;APPROX_PERCENTILE_CONT(column, 0.5)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APPROX_DISTINCT(column)&lt;/code&gt; — Returns the approximate number of distinct values. Works on any column type.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;APPROX_TOP_K(column, k)&lt;/code&gt; — Returns the &lt;code&gt;k&lt;/code&gt; most frequent values with their counts as a JSON array.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All functions support &lt;code&gt;WHERE&lt;/code&gt; filters. All except &lt;code&gt;APPROX_TOP_K&lt;/code&gt; support &lt;code&gt;GROUP BY&lt;/code&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;examples&quot;&gt;Examples&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#examples&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Percentile analysis on revenue data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; approx_percentile_cont&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;25&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;       approx_percentile_cont&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;       approx_percentile_cont&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;75&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Median per department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; department, approx_median(total_amount)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; department&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Approximate distinct customers by region&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region, approx_distinct(customer_id)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Top 5 most frequent departments&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; approx_top_k(department, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Combine approximate and standard aggregations&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;       AVG&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;       approx_percentile_cont&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;       approx_distinct(customer_id)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;North&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For the full syntax and additional examples, refer to the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Workers - Visualize data, share links, and create exports with the new Workers Observability dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-02-06-observability-ui-refresh/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-06-observability-ui-refresh/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages/observability/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Workers Observability dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; has some major updates to make it easier to debug your application&apos;s issues and share findings with your team.&lt;/p&gt;
&lt;img src=&quot;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&quot; alt=&quot;Workers Observability dashboard showing events view with event details and share options&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2540&quot; height=&quot;1170&quot;&gt;
&lt;p&gt;You can now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Create visualizations&lt;/strong&gt; — Build charts from your Worker data directly in a Worker&apos;s Observability tab&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Export data as JSON or CSV&lt;/strong&gt; — Download logs and traces for offline analysis or to share with teammates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Share events and traces&lt;/strong&gt; — Generate direct URLs to specific events, invocations, and traces that open standalone pages with full context&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customize table columns&lt;/strong&gt; — Improved field picker to add, remove, and reorder columns in the events table&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expandable event details&lt;/strong&gt; — Expand events inline to view full details without leaving the table&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Keyboard shortcuts&lt;/strong&gt; — Navigate the dashboard with hotkey support&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2596,height=1314,format=webp/_astro/2026-01-22-vis_qb_wobs.Bb5eVQNT.png&quot; alt=&quot;Workers Observability dashboard showing a P99 CPU time visualization grouped by outcome&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2596&quot; height=&quot;1314&quot;&gt;
&lt;p&gt;These updates are now live in the Cloudflare dashboard, both in a Worker&apos;s Observability tab and in the account-level Observability dashboard for a unified experience. To get started, go to &lt;strong&gt;Workers &amp;amp; Pages&lt;/strong&gt; &amp;gt; select your Worker &amp;gt; &lt;strong&gt;Observability&lt;/strong&gt;.&lt;/p&gt;</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Crawl Control - New reference documentation</title><link>https://developers.cloudflare.com/changelog/post/2026-02-09-reference-documentation/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-09-reference-documentation/</guid><description>&lt;p&gt;New reference documentation is now available for AI Crawl Control:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/reference/graphql-api/&quot;&gt;GraphQL API reference&lt;/a&gt;&lt;/strong&gt; — Query examples for crawler requests, top paths, referral traffic, and data transfer. Includes key filters for detection IDs, user agents, and referrer domains.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/reference/bots/&quot;&gt;Bot reference&lt;/a&gt;&lt;/strong&gt; — Detection IDs and user agents for major AI crawlers from OpenAI, Anthropic, Google, Meta, and others.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/reference/worker-templates/&quot;&gt;Worker templates&lt;/a&gt;&lt;/strong&gt; — Deploy the x402 Payment-Gated Proxy to monetize crawler access or charge bots while letting humans through free.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><product>AI Crawl Control</product><category>AI Crawl Control</category></item><item><title>Queues - Cloudflare Queues now available on Workers Free plan</title><link>https://developers.cloudflare.com/changelog/post/2026-02-04-queues-free-plan/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-04-queues-free-plan/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/queues&quot;&gt;Cloudflare Queues&lt;/a&gt; is now part of the Workers free plan, offering guaranteed message delivery across up to &lt;strong&gt;10,000 queues&lt;/strong&gt; to either &lt;a href=&quot;https://developers.cloudflare.com/workers&quot;&gt;Cloudflare Workers&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/queues/configuration/pull-consumers&quot;&gt;HTTP pull consumers&lt;/a&gt;. Every Cloudflare account now includes &lt;strong&gt;10,000 operations per day&lt;/strong&gt; across reads, writes, and deletes. For more details on how each operation is defined, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/pricing/#queues&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Queues pricing&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All features of the existing Queues functionality are available on the free plan, including unlimited &lt;a href=&quot;https://developers.cloudflare.com/queues/event-subscriptions/&quot;&gt;event subscriptions&lt;/a&gt;. Note that the maximum retention period on the free tier, however, is 24 hours rather than 14 days.&lt;/p&gt;
&lt;p&gt;If you are new to Cloudflare Queues, follow &lt;a href=&quot;https://developers.cloudflare.com/queues/get-started/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;this guide&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; or try one of our &lt;a href=&quot;https://developers.cloudflare.com/queues/tutorials/&quot;&gt;tutorials&lt;/a&gt; to get started.&lt;/p&gt;</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><product>Queues</product><category>Queues</category></item><item><title>Workflows, Workers - Visualize your Workflows in the Cloudflare dashboard</title><link>https://developers.cloudflare.com/changelog/post/2026-02-03-workflows-visualizer/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-03-workflows-visualizer/</guid><description>&lt;p&gt;Cloudflare Workflows now automatically generates visual diagrams from your code&lt;/p&gt;
&lt;p&gt;Your Workflow is parsed to provide a visual map of the Workflow structure, allowing you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Understand how steps connect and execute&lt;/li&gt;
&lt;li&gt;Visualize loops and nested logic&lt;/li&gt;
&lt;li&gt;Follow branching paths for conditional logic&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1927,height=1530,format=webp/_astro/2026-02-03-workflows-diagram.BfQAnWL3.png&quot; alt=&quot;Example diagram&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1927&quot; height=&quot;1530&quot;&gt;
&lt;p&gt;You can collapse loops and nested logic to see the high-level flow, or expand them to see every step.&lt;/p&gt;
&lt;p&gt;Workflow diagrams are available in beta for all JavaScript and TypeScript Workflows. Find your Workflows in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/workflows&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to see their diagrams.&lt;/p&gt;</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Agents, Workflows - Agents SDK v0.3.7: Workflows integration, synchronous state, and scheduleEvery()</title><link>https://developers.cloudflare.com/changelog/post/2026-02-03-agents-workflows-integration/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-03-agents-workflows-integration/</guid><description>
&lt;p&gt;The latest release of the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; brings first-class support for &lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Cloudflare Workflows&lt;/a&gt;, synchronous state management, and new scheduling capabilities.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cloudflare-workflows-integration&quot;&gt;Cloudflare Workflows integration&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cloudflare-workflows-integration&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Use the new &lt;code&gt;AgentWorkflow&lt;/code&gt; class to define workflows with typed access to your Agent:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { AgentWorkflow } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ProcessingWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Call Agent methods via RPC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.agent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;updateStatus&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(event.payload.taskId, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;processing&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Non-durable: progress reporting to clients&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;reportProgress&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ step: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;process&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, percent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;broadcastToClients&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;update&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, taskId: event.payload.taskId });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Durable via step: idempotent, won&apos;t repeat on retry&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;mergeAgentState&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ taskProgress: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;process&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; processData&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(event.payload.data);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;reportComplete&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(result);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; result;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { AgentWorkflow } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { AgentWorkflowEvent, AgentWorkflowStep } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/workflows&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ProcessingWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;TaskParams&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentWorkflowEvent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;TaskParams&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;step&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; AgentWorkflowStep&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Call Agent methods via RPC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.agent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;updateStatus&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(event.payload.taskId, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;processing&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Non-durable: progress reporting to clients&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;reportProgress&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ step: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;process&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, percent: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;broadcastToClients&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;update&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, taskId: event.payload.taskId });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Durable via step: idempotent, won&apos;t repeat on retry&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;mergeAgentState&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ taskProgress: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;do&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;process&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; processData&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(event.payload.data);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; step.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;reportComplete&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(result);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; result;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;
&lt;p&gt;Start workflows from your Agent with &lt;code&gt;runWorkflow()&lt;/code&gt; and handle lifecycle events:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; startTask&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;taskId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PROCESSING_WORKFLOW&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			taskId,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			data,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { instanceId };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onWorkflowProgress&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;workflowName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;progress&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;broadcast&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;progress&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, progress }));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onWorkflowComplete&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;workflowName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Workflow ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} completed`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onWorkflowError&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;workflowName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Workflow ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} failed:`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, error);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; startTask&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;taskId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;runWorkflow&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;PROCESSING_WORKFLOW&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			taskId,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			data,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { instanceId };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onWorkflowProgress&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		workflowName&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		progress&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; unknown&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;broadcast&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;progress&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, progress }));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onWorkflowComplete&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		workflowName&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;?:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; unknown&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Workflow ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} completed`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; onWorkflowError&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		workflowName&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;		error&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; unknown&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Workflow ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;instanceId&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} failed:`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, error);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Key workflow methods on your Agent:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;runWorkflow(workflowName, params, options?)&lt;/code&gt; — Start a workflow with optional metadata&lt;/li&gt;
&lt;li&gt;&lt;code&gt;getWorkflow(workflowId)&lt;/code&gt; / &lt;code&gt;getWorkflows(criteria?)&lt;/code&gt; — Query workflows with cursor-based pagination&lt;/li&gt;
&lt;li&gt;&lt;code&gt;approveWorkflow(workflowId)&lt;/code&gt; / &lt;code&gt;rejectWorkflow(workflowId)&lt;/code&gt; — Human-in-the-loop approval flows&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pauseWorkflow()&lt;/code&gt;, &lt;code&gt;resumeWorkflow()&lt;/code&gt;, &lt;code&gt;terminateWorkflow()&lt;/code&gt; — Workflow control&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;synchronous-setstate&quot;&gt;Synchronous setState()&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#synchronous-setstate&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;State updates are now synchronous with a new &lt;code&gt;validateStateChange()&lt;/code&gt; validation hook:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	validateStateChange&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;oldState&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;newState&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Return false to reject the change&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (newState.count &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Return modified state to transform&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;newState, lastUpdated: Date.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; MyAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;State&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	validateStateChange&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;oldState&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; State&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;newState&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; State&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; State&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Return false to reject the change&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (newState.count &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Return modified state to transform&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;newState, lastUpdated: Date.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;scheduleevery-for-recurring-tasks&quot;&gt;scheduleEvery() for recurring tasks&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#scheduleevery-for-recurring-tasks&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The new &lt;code&gt;scheduleEvery()&lt;/code&gt; method enables fixed-interval recurring tasks with built-in overlap prevention:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Run every 5 minutes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;scheduleEvery&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;syncData&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 60&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { source: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;api&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Run every 5 minutes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;scheduleEvery&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;syncData&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 60&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { source: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;api&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;callable-system-improvements&quot;&gt;Callable system improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#callable-system-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Client-side RPC timeout&lt;/strong&gt; — Set timeouts on callable method invocations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;StreamingResponse.error(message)&lt;/code&gt;&lt;/strong&gt; — Graceful stream error signaling&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;getCallableMethods()&lt;/code&gt;&lt;/strong&gt; — Introspection API for discovering callable methods&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connection close handling&lt;/strong&gt; — Pending calls are automatically rejected on disconnect&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; agent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;method&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, [args], {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	stream: { onChunk, onDone, onError },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; agent.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;method&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, [args], {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	timeout: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;5000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	stream: { onChunk, onDone, onError },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;email-and-routing-enhancements&quot;&gt;Email and routing enhancements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#email-and-routing-enhancements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Secure email reply routing&lt;/strong&gt; — Email replies are now secured with HMAC-SHA256 signed headers, preventing unauthorized routing of emails to agent instances.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Routing improvements:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;basePath&lt;/code&gt; option to bypass default URL construction for custom routing&lt;/li&gt;
&lt;li&gt;Server-sent identity — Agents send &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;agent&lt;/code&gt; type on connect&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;onIdentity&lt;/code&gt; and &lt;code&gt;onIdentityChange&lt;/code&gt; callbacks on the client&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	basePath: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onIdentity&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;agentType&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Connected to ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; agent&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useAgent&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	basePath: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onIdentity&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;agentType&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Connected to ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; agents@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For the complete Workflows API reference and patterns, see &lt;a href=&quot;https://developers.cloudflare.com/agents/runtime/execution/run-workflows/&quot;&gt;Run Workflows&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workflows</category></item><item><title>R2 - Improve Global Upload Performance with R2 Local Uploads - Now in Open Beta</title><link>https://developers.cloudflare.com/changelog/post/2026-02-03-r2-local-uploads/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-03-r2-local-uploads/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2/buckets/local-uploads/&quot;&gt;Local Uploads&lt;/a&gt; is now available in open beta. Enable it on your &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/r2/how-r2-works/&quot;&gt;How R2 works&lt;/a&gt; for details on how data is written to your bucket.&lt;/p&gt;
&lt;p&gt;In our tests, we observed &lt;strong&gt;up to 75% reduction in Time to Last Byte (TTLB)&lt;/strong&gt; for upload requests when Local Uploads is enabled.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1506,height=596,format=webp/_astro/local-uploads-latency.R4pUgVuI.png&quot; alt=&quot;Local Uploads latency comparison showing p50 TTLB dropping from around 2 seconds to 500ms after enabling Local Uploads&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1506&quot; height=&quot;596&quot;&gt;
&lt;p&gt;This feature is ideal when:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your users are globally distributed&lt;/li&gt;
&lt;li&gt;Upload performance and reliability is critical to your application&lt;/li&gt;
&lt;li&gt;You want to optimize write performance without changing your bucket&apos;s primary location&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To enable Local Uploads on your bucket, find &lt;strong&gt;Local Uploads&lt;/strong&gt; in your bucket settings in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/r2/overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, or run:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; bucket&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; local-uploads&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; enable&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;BUCKET_NAM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/r2/pricing/&quot;&gt;Class A operation costs&lt;/a&gt; same as upload requests made without Local Uploads.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2/buckets/local-uploads/&quot;&gt;Local Uploads&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><product>R2</product><category>R2</category></item><item><title>Security Center - Threat actor identification with &quot;also known as&quot; aliases</title><link>https://developers.cloudflare.com/changelog/post/2026-02-03-threat-actor-name-mapping/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-03-threat-actor-name-mapping/</guid><description>&lt;p&gt;Identifying threat actors can be challenging, because naming conventions often vary across the security industry. To simplify your research, &lt;strong&gt;Cloudflare Threat Events&lt;/strong&gt; now include an &lt;strong&gt;Also known as&lt;/strong&gt; field, providing a list of common aliases and industry-standard names for the groups we track.&lt;/p&gt;
&lt;p&gt;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 &lt;strong&gt;Attacker&lt;/strong&gt; field) or by adding it as a column in your configurable table view.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-benefits&quot;&gt;Key benefits&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-benefits&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Easily map Cloudflare-tracked actors to the naming conventions used by other vendors without manual cross-referencing.&lt;/li&gt;
&lt;li&gt;Quickly identify if a detected threat actor matches a group your team is already monitoring via other intelligence feeds.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information on how to access this data, refer to the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/cloudforce_one/subresources/threat_events/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Threat Events API documentation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 03 Feb 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Email security - Improved Accessibility and Search for Monitoring</title><link>https://developers.cloudflare.com/changelog/post/2026-02-02-improved-accessibility-search-for-monitoring/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-02-improved-accessibility-search-for-monitoring/</guid><description>&lt;p&gt;We have updated the Monitoring page to provide a more streamlined and insightful experience for administrators, improving both data visualization and dashboard accessibility.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Enhanced Visual Layout&lt;/strong&gt;: Optimized contrast and the introduction of stacked bar charts for clearer data visualization and trend analysis.
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3212,height=2344,format=webp/_astro/monitoring-bar-charts.Bi-4BuXC.png&quot; alt=&quot;visual-example&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3212&quot; height=&quot;2344&quot;&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Improved Accessibility &amp;amp; Usability&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Widget Search&lt;/strong&gt;: Added search functionality to multiple widgets, including Policies, Submitters, and Impersonation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actionable UI&lt;/strong&gt;: All available actions are now accessible via dedicated buttons.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;State Indicators&lt;/strong&gt;: Improved UI states to clearly communicate loading, empty datasets, and error conditions.
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3178,height=664,format=webp/_astro/monitoring-buttons.DORPJvP_.png&quot; alt=&quot;buttons-example&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3178&quot; height=&quot;664&quot;&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Granular Data Breakdowns&lt;/strong&gt;: New views for dispositions by month, malicious email details, link actions, and impersonations.
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3202,height=1486,format=webp/_astro/monitoring-monthly-dispositions.CYuI5d9y.png&quot; alt=&quot;monthly-example&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3202&quot; height=&quot;1486&quot;&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;This applies to all Email Security packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advantage&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise + PhishGuard&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Mon, 02 Feb 2026 11:05:33 GMT</pubDate><product>Email security</product><category>Email security</category></item><item><title>WAF - WAF Release - 2026-02-02</title><link>https://developers.cloudflare.com/changelog/post/2026-02-02-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-02-02-waf-release/</guid><description>
&lt;p&gt;This week’s release introduces new detections for CVE-2025-64459 and CVE-2025-24893.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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 &lt;code&gt;Q()&lt;/code&gt; class.&lt;/li&gt;
&lt;li&gt;CVE-2025-24893: XWiki allows unauthenticated remote code execution through crafted requests to the SolrSearch endpoint, affecting the entire installation.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;7a47683eacce4abd870ab2c630698ff3&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...30698ff3&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XWiki - Remote Code Execution - CVE:CVE-2025-24893 2&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ad5c52f6ca334ef4a844e5e5da8ba7e6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...da8ba7e6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Django SQLI - CVE:CVE-2025-64459&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;8f0d5c98bd24460a9305a1558d667511&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8d667511&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;NoSQL, MongoDB - SQLi - Comparison - 2&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;Rule metadata description refined. Detection unchanged.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>KV - Reduced minimum cache TTL for Workers KV to 30 seconds</title><link>https://developers.cloudflare.com/changelog/post/2026-01-30-kv-reduced-minimum-cachettl/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-30-kv-reduced-minimum-cachettl/</guid><description>&lt;p&gt;The minimum &lt;code&gt;cacheTtl&lt;/code&gt; parameter for Workers KV has been reduced from 60 seconds to 30 seconds. This change applies to both &lt;code&gt;get()&lt;/code&gt; and &lt;code&gt;getWithMetadata()&lt;/code&gt; methods.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;cacheTtl&lt;/code&gt; parameter defines how long a KV result is cached at the global network location it is accessed from:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Read with custom cache TTL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; value&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;NAMESPACE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-key&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	cacheTtl: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Cache for minimum 30 seconds (previously 60)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// getWithMetadata also supports the reduced cache TTL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; valueWithMetadata&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;NAMESPACE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getWithMetadata&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-key&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	cacheTtl: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Cache for minimum 30 seconds&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;The default cache TTL remains unchanged at 60 seconds. Upgrade to the latest version of Wrangler to be able to use 30 seconds &lt;code&gt;cacheTtl&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This change affects all KV read operations using the binding API. For more information, consult the &lt;a href=&quot;https://developers.cloudflare.com/kv/api/read-key-value-pairs/#cachettl-parameter&quot;&gt;Workers KV cache TTL documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 30 Jan 2026 12:00:00 GMT</pubDate><product>KV</product><category>KV</category></item><item><title>Cloudflare WAN, Magic Transit, Cloudflare One - BGP over GRE and IPsec tunnels</title><link>https://developers.cloudflare.com/changelog/post/2026-01-30-bgp-over-tunnels/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-30-bgp-over-tunnels/</guid><description>&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;Using BGP peering allows customers to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automate the process of adding or removing networks and subnets.&lt;/li&gt;
&lt;li&gt;Take advantage of failure detection and session recovery features.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With this functionality, customers can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Establish an eBGP session between their devices and the Magic WAN / Magic Transit service when connected via IPsec and GRE tunnel on-ramps.&lt;/li&gt;
&lt;li&gt;Secure the session by MD5 authentication to prevent misconfigurations.&lt;/li&gt;
&lt;li&gt;Exchange routes dynamically between their devices and their Magic routing table.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For configuration details, refer to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/how-to/configure-routes/#configure-bgp-routes&quot;&gt;Configure BGP routes for Magic WAN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/magic-transit/how-to/configure-routes/#configure-bgp-routes&quot;&gt;Configure BGP routes for Magic Transit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 30 Jan 2026 00:00:00 GMT</pubDate><product>Cloudflare WAN</product><category>Cloudflare WAN</category><category>Magic Transit</category><category>Cloudflare One</category></item><item><title>Workers AI - Launching FLUX.2 [klein] 9B on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2026-01-28-flux-2-klein-9b-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-28-flux-2-klein-9b-workers-ai/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://bfl.ai/blog&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BFL blog&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to learn more about the model itself, or try it out yourself on our &lt;a href=&quot;https://multi-modal.ai.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;multi modal playground&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pricing documentation is available on the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/flux-2-klein-9b/&quot;&gt;model page&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing page&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;workers-ai-platform-specifics&quot;&gt;Workers AI platform specifics&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#workers-ai-platform-specifics&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The model hosted on Workers AI is optimized for speed with a &lt;strong&gt;fixed 4-step inference process&lt;/strong&gt; and supports up to 4 image inputs. Since this is a distilled model, the &lt;code&gt;steps&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;With the REST API, the multipart form data input looks like this:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --url&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-klein-9b&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer {TOKEN}&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: multipart/form-data&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --form&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;prompt=a sunset at the alps&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --form&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; width=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --form&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; height=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1024&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;With the Workers AI binding, you can use it as such:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; form&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; FormData&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;prompt&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;a sunset with a dog&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;width&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;1024&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;height&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;1024&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// FormData doesn&apos;t expose its serialized body or boundary. Passing it to a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Request (or Response) constructor serializes it and generates the Content-Type&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// header with the boundary, which is required for the server to parse the multipart fields.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formResponse&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(form);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formStream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; formResponse.body;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formContentType&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; formResponse.headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;content-type&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; resp&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/black-forest-labs/flux-2-klein-9b&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	multipart: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		body: formStream,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		contentType: formContentType,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;The parameters you can send to the model are detailed here:&lt;/p&gt;
&lt;details&gt;&lt;p&gt;&lt;summary&gt;JSON Schema for Model&lt;/summary&gt;
&lt;strong&gt;Required Parameters&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;prompt&lt;/code&gt; (string) - Text description of the image to generate&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Optional Parameters&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input_image_0&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_1&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_2&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_3&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;guidance&lt;/code&gt; (float) - Guidance scale for generation. Higher values follow the prompt more closely&lt;/li&gt;
&lt;li&gt;&lt;code&gt;width&lt;/code&gt; (integer) - Width of the image, default &lt;code&gt;1024&lt;/code&gt; Range: 256-1920&lt;/li&gt;
&lt;li&gt;&lt;code&gt;height&lt;/code&gt; (integer) - Height of the image, default &lt;code&gt;768&lt;/code&gt; Range: 256-1920&lt;/li&gt;
&lt;li&gt;&lt;code&gt;seed&lt;/code&gt; (integer) - Seed for reproducibility&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Since this is a distilled model, the &lt;code&gt;steps&lt;/code&gt; parameter is fixed at 4 and cannot be adjusted.&lt;/p&gt;&lt;/details&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;multi-reference-images&quot;&gt;Multi-reference images&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#multi-reference-images&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;For the prompt, you can reference the images based on the index, like &lt;code&gt;take the subject of image 1 and style it like image 0&lt;/code&gt; or even use natural language like &lt;code&gt;place the dog beside the woman&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You must name the input parameter as &lt;code&gt;input_image_0&lt;/code&gt;, &lt;code&gt;input_image_1&lt;/code&gt;, &lt;code&gt;input_image_2&lt;/code&gt;, &lt;code&gt;input_image_3&lt;/code&gt; for it to work correctly. All input images must be smaller than 512x512.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --url&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-klein-9b&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer {TOKEN}&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: multipart/form-data&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --form&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;prompt=take the subject of image 1 and style it like image 0&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --form&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; input_image_0=@/Users/johndoe/Desktop/icedoutkeanu.png&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --form&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; input_image_1=@/Users/johndoe/Desktop/me.png&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --form&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; width=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --form&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; height=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1024&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Through Workers AI Binding:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//helper function to convert ReadableStream to Blob&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; function&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamToBlob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;stream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ReadableStream&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;contentType&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Blob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; reader&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stream.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getReader&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; chunks&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  while&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; reader.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (done) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    chunks.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(value);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Blob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(chunks, { type: contentType });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; image0&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;http://image-url&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; image1&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;http://image-url&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; form&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; FormData&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; image_blob0&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamToBlob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(image0.body, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;image/png&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; image_blob1&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamToBlob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(image1.body, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;image/png&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;input_image_0&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, image_blob0)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;input_image_1&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, image_blob1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;prompt&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;take the subject of image 1 and style it like image 0&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// FormData doesn&apos;t expose its serialized body or boundary. Passing it to a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Request (or Response) constructor serializes it and generates the Content-Type&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// header with the boundary, which is required for the server to parse the multipart fields.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formResponse&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(form);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formStream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; formResponse.body;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formContentType&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; formResponse.headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;content-type&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; resp&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/black-forest-labs/flux-2-klein-9b&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    multipart: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        body: formStream,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        contentType: formContentType&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><pubDate>Wed, 28 Jan 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Cloudflare One Client - WARP client for Windows (version 2026.1.89.1)</title><link>https://developers.cloudflare.com/changelog/post/2026-01-27-warp-windows-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-27-warp-windows-beta/</guid><description>&lt;p&gt;A new Beta release for the Windows WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/&quot;&gt;beta releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes, improvements, and new features.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improvements to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/windows-multiuser/&quot;&gt;multi-user mode&lt;/a&gt;. Fixed an issue where when switching from a pre-login registration to a user registration, Mobile Device Management (MDM) configuration association could be lost.&lt;/li&gt;
&lt;li&gt;Added a new feature to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#netbios-over-tcpip&quot;&gt;manage NetBIOS over TCP/IP&lt;/a&gt; functionality on the Windows client. NetBIOS over TCP/IP on the Windows client is now disabled by default and can be enabled in &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/device-profiles/&quot;&gt;device profile settings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fixed an issue causing failure of the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#allow-users-to-enable-local-network-exclusion&quot;&gt;local network exclusion&lt;/a&gt; feature when configured with a timeout of &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Improvement for the Windows &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/warp-client-checks/client-certificate/&quot;&gt;client certificate posture check&lt;/a&gt; to ensure logged results are from checks that run once users log in.&lt;/li&gt;
&lt;li&gt;Improvement for more accurate reporting of device colocation information in the Cloudflare One dashboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd&quot;&gt;Windows 11 24H2 KB5062553&lt;/a&gt; or higher for resolution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Devices with KB5055523 installed may receive a warning about &lt;code&gt;Win32/ClickFix.ABA&lt;/code&gt; being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to &lt;a href=&quot;https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0&quot;&gt;version 1.429.19.0&lt;/a&gt; or later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS resolution may be broken when the following conditions are all true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.&lt;/li&gt;
&lt;li&gt;A custom DNS server address is configured on the primary network adapter.&lt;/li&gt;
&lt;li&gt;The custom DNS server address on the primary network adapter is changed while WARP is connected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To work around this issue, reconnect the WARP client by toggling off and back on.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 27 Jan 2026 18:47:00 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - WARP client for macOS (version 2026.1.89.1)</title><link>https://developers.cloudflare.com/changelog/post/2026-01-27-warp-macos-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-27-warp-macos-beta/</guid><description>&lt;p&gt;A new Beta release for the macOS WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/&quot;&gt;beta releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes and improvements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an issue causing failure of the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#allow-users-to-enable-local-network-exclusion&quot;&gt;local network exclusion&lt;/a&gt; feature when configured with a timeout of &lt;code&gt;0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Improvement for more accurate reporting of device colocation information in the Cloudflare One dashboard.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 27 Jan 2026 18:46:59 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One, Cloudflare WAN - Configure Cloudflare source IPs (beta)</title><link>https://developers.cloudflare.com/changelog/post/2026-01-27-configure-cloudflare-source-ips/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-27-configure-cloudflare-source-ips/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Symmetric routing over private network connections&lt;/li&gt;
&lt;li&gt;Proper firewall state preservation&lt;/li&gt;
&lt;li&gt;Private traffic stays on secure paths&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Key details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IPv4&lt;/strong&gt;: Sourced from &lt;code&gt;100.64.0.0/12&lt;/code&gt; by default, configurable to any &lt;code&gt;/12&lt;/code&gt; CIDR&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPv6&lt;/strong&gt;: Sourced from &lt;code&gt;2606:4700:cf1:5000::/64&lt;/code&gt; (not configurable)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Affected connectors&lt;/strong&gt;: GRE, IPsec, CNI, WARP Connector, and WARP Client (Cloudflare Tunnel is not affected)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Configuring Cloudflare source IPs requires Unified Routing (beta) and the &lt;code&gt;Cloudflare One Networks Write&lt;/code&gt; permission.&lt;/p&gt;
&lt;p&gt;For configuration details, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/how-to/configure-cloudflare-source-ips/&quot;&gt;Configure Cloudflare source IPs&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category><category>Cloudflare WAN</category></item><item><title>Cloudflare Fundamentals - Added Timezone preferences settings</title><link>https://developers.cloudflare.com/changelog/post/2026-01-27-timezone-preferences/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-27-timezone-preferences/</guid><description>&lt;p&gt;You can now set the timezone in the Cloudflare dashboard as Coordinated Universal Time (UTC) or your browser or system&apos;s timezone.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s New&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Unless otherwise specified in the user interface, all dates and times in the Cloudflare dashboard are now displayed in the selected timezone.&lt;/p&gt;
&lt;p&gt;You can change the timezone setting from the user profile dropdown.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=848,height=682,format=webp/_astro/2026-01-27-set-timezone.CUmMl54E.png&quot; alt=&quot;Timezone preference dropdown&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;848&quot; height=&quot;682&quot;&gt;
&lt;p&gt;The page will reload to apply the new timezone setting.&lt;/p&gt;</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Rules - Control request and response body buffering in Configuration Rules</title><link>https://developers.cloudflare.com/changelog/post/2026-01-27-body-buffering-settings/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-27-body-buffering-settings/</guid><description>&lt;p&gt;You can now control how Cloudflare buffers HTTP request and response bodies using two new settings in &lt;a href=&quot;https://developers.cloudflare.com/rules/configuration-rules/&quot;&gt;Configuration Rules&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;request-body-buffering&quot;&gt;Request body buffering&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#request-body-buffering&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Controls how Cloudflare buffers HTTP request bodies before forwarding them to your origin server:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standard&lt;/strong&gt; (default)&lt;/td&gt;
&lt;td&gt;Cloudflare can inspect a prefix of the request body for enabled functionality such as WAF and Bot Management.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Buffers the entire request body before sending to origin.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;None&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No buffering — the request body streams directly to origin without inspection.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;response-body-buffering&quot;&gt;Response body buffering&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#response-body-buffering&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Controls how Cloudflare buffers HTTP response bodies before forwarding them to the client:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standard&lt;/strong&gt; (default)&lt;/td&gt;
&lt;td&gt;Cloudflare can inspect a prefix of the response body for enabled functionality.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;None&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No buffering — the response body streams directly to the client without inspection.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Caution&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-warning); --_t: var(--nb-warning-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:warning&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Caution&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;Setting body buffering to &lt;strong&gt;None&lt;/strong&gt; 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.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;api-example&quot;&gt;API example&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#api-example&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;action&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;set_config&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;action_parameters&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;request_body_buffering&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;standard&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;response_body_buffering&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;none&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/rules/configuration-rules/&quot;&gt;Configuration Rules&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 27 Jan 2026 00:00:00 GMT</pubDate><product>Rules</product><category>Rules</category></item><item><title>WAF - WAF Release - 2026-01-26</title><link>https://developers.cloudflare.com/changelog/post/2026-01-26-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-26-waf-release/</guid><description>
&lt;p&gt;This week’s release introduces new detections for denial-of-service attempts targeting React CVE-2026-23864 (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-23864&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.cve.org/CVERecord?id=CVE-2026-23864&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CVE-2026-23864 (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-23864&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.cve.org/CVERecord?id=CVE-2026-23864&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;) affects &lt;code&gt;react-server-dom-parcel&lt;/code&gt;, &lt;code&gt;react-server-dom-turbopack&lt;/code&gt;, and &lt;code&gt;react-server-dom-webpack&lt;/code&gt; packages.&lt;/li&gt;
&lt;li&gt;Attackers can send crafted HTTP requests to Server Function endpoints, causing server crashes, out-of-memory exceptions, or excessive CPU usage.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;aaede80b4d414dc89c443cea61680354&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...61680354&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;React Server - DOS - CVE:CVE-2026-23864 - 1&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;3e93c9faaafa447c83a525f2dcdffcf8&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...dcdffcf8&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;React Server - DOS - CVE:CVE-2026-23864 - 2&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;930020d567684f19b05fb35b349edbc6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...349edbc6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;React Server - DOS - CVE:CVE-2026-23864 - 3&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 26 Jan 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Cloudflare Fundamentals - New 2FA Experience for Login</title><link>https://developers.cloudflare.com/changelog/post/2026-01-23-New-2FA-Experience/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-23-New-2FA-Experience/</guid><description>&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2721,height=1820,format=webp/_astro/2026-01-23-2fa-interstitial.TXFGNSth.png&quot; alt=&quot;Screenshot of new 2FA enrollment experience&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2721&quot; height=&quot;1820&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;for-more-information&quot;&gt;For more information&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#for-more-information&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/user-profiles/2fa/#configure-email-two-factor-authentication&quot;&gt;Configure Email Two Factor Authentication&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Pages - Increased Pages file limit to 100,000 for paid plans</title><link>https://developers.cloudflare.com/changelog/post/2026-01-23-pages-file-limit-increase/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-23-pages-file-limit-increase/</guid><description>&lt;p&gt;Paid plans can now have up to 100,000 files per Pages site, increased from the previous limit of 20,000 files.&lt;/p&gt;
&lt;p&gt;To enable this increased limit, set the environment variable &lt;code&gt;PAGES_WRANGLER_MAJOR_VERSION=4&lt;/code&gt; in your Pages project settings.&lt;/p&gt;
&lt;p&gt;The Free plan remains at 20,000 files per site.&lt;/p&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/pages/platform/limits/#files&quot;&gt;Pages limits documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate><product>Pages</product><category>Pages</category></item><item><title>Vectorize - Vectorize indexes now support up to 10 million vectors</title><link>https://developers.cloudflare.com/changelog/post/2026-01-23-increased-index-capacity/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-23-increased-index-capacity/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Vectorize continues to support indexes with up to 1,536 dimensions per vector at 32-bit precision. Refer to the &lt;a href=&quot;https://developers.cloudflare.com/vectorize/platform/limits/&quot;&gt;Vectorize limits documentation&lt;/a&gt; for complete details.&lt;/p&gt;</description><pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate><product>Vectorize</product><category>Vectorize</category></item><item><title>Cloudflare One, Access - Require Access protection for zones</title><link>https://developers.cloudflare.com/changelog/post/2026-01-22-deny-by-default-for-zones/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-22-deny-by-default-for-zones/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2160,height=738,format=webp/_astro/require-cloudflare-access-protection.BAUmTYOs.png&quot; alt=&quot;Require Cloudflare Access protection in the dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2160&quot; height=&quot;738&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;how-it-works&quot;&gt;How it works&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#how-it-works&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Blocked by default&lt;/strong&gt;: Traffic to all hostnames in the account is blocked unless an Access application exists for that hostname.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Explicit access required&lt;/strong&gt;: To allow traffic, create an Access application with an Allow or Bypass policy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hostname exemptions&lt;/strong&gt;: You can exempt specific hostnames from this requirement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To turn on this feature, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/require-access-protection/&quot;&gt;Require Access protection&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category><category>Access</category></item><item><title>Access - New granular API token permissions for Cloudflare Access</title><link>https://developers.cloudflare.com/changelog/post/2026-01-22-granular-api-token-permissions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-22-granular-api-token-permissions/</guid><description>&lt;p&gt;Three new API token permissions are available for Cloudflare Access, giving you finer-grained control when building automations and integrations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Access: Organizations Revoke&lt;/strong&gt; — Grants the ability to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/access-settings/session-management/#revoke-user-sessions&quot;&gt;revoke user sessions&lt;/a&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access: Population Read&lt;/strong&gt; — Grants read access to the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/users/scim/&quot;&gt;SCIM users and groups&lt;/a&gt; synced from an identity provider to Cloudflare Access. Use this permission for tokens that only need to read synced user and group data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Access: Population Write&lt;/strong&gt; — Grants write access to the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/users/scim/&quot;&gt;SCIM users and groups&lt;/a&gt; synced from an identity provider to Cloudflare Access. Use this permission for tokens that need to create or modify synced user and group data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These permissions are scoped at the account level and can be combined with existing Access permissions.&lt;/p&gt;
&lt;p&gt;For a full list of available permissions, refer to &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/api/reference/permissions/&quot;&gt;API token permissions&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Rules - New cryptographic functions — encode_base64() and sha256()</title><link>https://developers.cloudflare.com/changelog/post/2026-01-22-sha256-base64-encode-functions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-22-sha256-base64-encode-functions/</guid><description>&lt;p&gt;Cloudflare Rulesets now includes &lt;code&gt;encode_base64()&lt;/code&gt; and &lt;code&gt;sha256()&lt;/code&gt; 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.&lt;/p&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-functions&quot;&gt;New functions&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-functions&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Availability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;encode_base64(input, flags)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Encodes a string to Base64 format. Optional &lt;code&gt;flags&lt;/code&gt; parameter: &lt;code&gt;u&lt;/code&gt; for URL-safe encoding, &lt;code&gt;p&lt;/code&gt; for padding (adds &lt;code&gt;=&lt;/code&gt; characters to make the output length a multiple of 4, as required by some systems). By default, output is standard Base64 without padding.&lt;/td&gt;
&lt;td&gt;All plans (in header transform rules)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sha256(input)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Computes a SHA256 hash of the input string.&lt;/td&gt;
&lt;td&gt;Requires enablement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;The &lt;code&gt;sha256()&lt;/code&gt; function is available as an Enterprise add-on and requires a specific entitlement. Contact your account team to enable it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;examples&quot;&gt;Examples&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#examples&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Encode a string to Base64 format:&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;encode_base64(&quot;hello world&quot;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Returns: &lt;code&gt;aGVsbG8gd29ybGQ&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Encode a string to Base64 format with padding:&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;encode_base64(&quot;hello world&quot;, &quot;p&quot;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Returns: &lt;code&gt;aGVsbG8gd29ybGQ=&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Perform a URL-safe Base64 encoding of a string:&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;encode_base64(&quot;hello world&quot;, &quot;u&quot;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Returns: &lt;code&gt;aGVsbG8gd29ybGQ&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compute the SHA256 hash of a secret token:&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;sha256(&quot;my-token&quot;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Returns a hash that your origin can validate to authenticate requests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compute the SHA256 hash of a string and encode the result to Base64 format:&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;encode_base64(sha256(&quot;my-token&quot;))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Combines hashing and encoding for systems that expect Base64-encoded signatures.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ruleset-engine/rules-language/functions/&quot;&gt;Functions reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate><product>Rules</product><category>Rules</category></item><item><title>Workers - New Placement Hints for Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-01-22-explicit-placement-hints/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-22-explicit-placement-hints/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/placement/#configure-explicit-placement-hints&quot;&gt;set a placement hint&lt;/a&gt;, set the &lt;code&gt;placement.region&lt;/code&gt; property in your Wrangler configuration file:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;placement&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;region&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;aws:us-east-1&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;placement&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;region = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;aws:us-east-1&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;Placement hints support Amazon Web Services (AWS), Google Cloud Platform (GCP), and Microsoft Azure region identifiers. Workers run in the &lt;a href=&quot;https://www.cloudflare.com/network/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare data center&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; with the lowest latency to the specified cloud region.&lt;/p&gt;
&lt;p&gt;If your existing infrastructure is not in these cloud providers, expose it to placement probes with &lt;code&gt;placement.host&lt;/code&gt; for layer 4 checks or &lt;code&gt;placement.hostname&lt;/code&gt; for layer 7 checks. These probes are designed to locate single-homed infrastructure and are not suitable for anycasted or multicasted resources.&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;placement&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;host&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my_database_host.com:5432&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;placement&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;host = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my_database_host.com:5432&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;placement&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;hostname&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my_api_server.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;placement&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;hostname = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my_api_server.com&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This is an extension of &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/placement/#enable-smart-placement&quot;&gt;Smart Placement&lt;/a&gt;, 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 &lt;code&gt;mode: &quot;smart&quot;&lt;/code&gt;:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;placement&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;mode&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;smart&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;placement&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;mode = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;smart&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description><pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Search - AI Search path filtering for website and R2 data sources</title><link>https://developers.cloudflare.com/changelog/post/2026-01-20-ai-search-path-filtering/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-20-ai-search-path-filtering/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now includes &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/indexing/path-filtering/&quot;&gt;path filtering&lt;/a&gt; for both &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/website/#path-filtering&quot;&gt;website&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/r2/#path-filtering&quot;&gt;R2&lt;/a&gt; data sources. You can now control which content gets indexed by defining include and exclude rules for paths.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2346,height=1360,format=webp/_astro/path-filtering.BCH7HN-Q.png&quot; alt=&quot;Path filtering configuration in AI Search&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2346&quot; height=&quot;1360&quot;&gt;
&lt;p&gt;Path filtering uses &lt;a href=&quot;https://github.com/micromatch/micromatch&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;micromatch&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; patterns, so you can use &lt;code&gt;*&lt;/code&gt; to match within a directory and &lt;code&gt;**&lt;/code&gt; to match across directories.&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;th&gt;Include&lt;/th&gt;
&lt;th&gt;Exclude&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Index docs but skip drafts&lt;/td&gt;
&lt;td&gt;&lt;code&gt;**/docs/**&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;**/docs/drafts/**&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keep admin pages out of results&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;code&gt;**/admin/**&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Index only English content&lt;/td&gt;
&lt;td&gt;&lt;code&gt;**/en/**&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Configure path filters when creating a new instance or update them anytime from &lt;strong&gt;Settings&lt;/strong&gt;. Check out &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/indexing/path-filtering/&quot;&gt;path filtering&lt;/a&gt; to learn more.&lt;/p&gt;</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>AI Search - Create AI Search instances programmatically via REST API</title><link>https://developers.cloudflare.com/changelog/post/2026-01-20-ai-search-simplified-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-20-ai-search-simplified-api/</guid><description>&lt;p&gt;You can now create &lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; instances programmatically using the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/get-started/api/&quot;&gt;API&lt;/a&gt;. For example, use the API to create instances for each customer in a multi-tenant application or manage AI Search alongside your other infrastructure.&lt;/p&gt;
&lt;p&gt;If you have created an AI Search instance via the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/get-started/dashboard/&quot;&gt;dashboard&lt;/a&gt; before, you already have a &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/indexing/service-api-token/&quot;&gt;service API token&lt;/a&gt; registered and can start creating instances programmatically right away. If not, follow the &lt;a href=&quot;https://developers.cloudflare.com/ai-search/get-started/api/&quot;&gt;API guide&lt;/a&gt; to set up your first instance.&lt;/p&gt;
&lt;p&gt;For example, you can now create separate search instances for each language on your website:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; lang &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;in&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; en&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; fr&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; es&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; de&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;; &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;  curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/ai-search/instances&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$API_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;id&quot;: &quot;docs-&apos;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$lang&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&apos;&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;type&quot;: &quot;web-crawler&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;source&quot;: &quot;example.com&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;source_params&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;path_include&quot;: [&quot;**/&apos;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$lang&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&apos;/**&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    }&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;done&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/ai_search/subresources/instances/methods/create/&quot;&gt;REST API reference&lt;/a&gt; for additional configuration options.&lt;/p&gt;</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>KV - New Workers KV Dashboard UI</title><link>https://developers.cloudflare.com/changelog/post/2026-01-20-kv-dash-ui-homepage/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-20-kv-dash-ui-homepage/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/kv/&quot;&gt;Workers KV&lt;/a&gt; has an updated dashboard UI with new dashboard styling that makes it easier to navigate and see analytics and settings for a KV namespace.&lt;/p&gt;
&lt;p&gt;The new dashboard features a &lt;strong&gt;streamlined homepage&lt;/strong&gt; for easy access to your namespaces and key operations, with consistent design with the rest of the dashboard UI updates. It also provides an &lt;strong&gt;improved analytics view&lt;/strong&gt;.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3444,height=1968,format=webp/_astro/kv-dash-ui-homepage.BT5hNntj.png&quot; alt=&quot;New KV Dashboard Homepage&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3444&quot; height=&quot;1968&quot;&gt;
&lt;p&gt;The updated dashboard is now available for all Workers KV users. Log in to the &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to start exploring the new interface.&lt;/p&gt;</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><product>KV</product><category>KV</category></item><item><title>Rules - New functions for array and map operations</title><link>https://developers.cloudflare.com/changelog/post/2026-01-20-array-map-functions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-20-array-map-functions/</guid><description>&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-functions-for-array-and-map-operations&quot;&gt;New functions for array and map operations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-functions-for-array-and-map-operations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-functions&quot;&gt;New functions&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-functions&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;split(source, delimiter)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Splits a string into an array of strings using the specified delimiter.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;join(array, delimiter)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Joins an array of strings into a single string using the specified delimiter.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;has_key(map, key)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns &lt;code&gt;true&lt;/code&gt; if the specified key exists in the map.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;has_value(map, value)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Returns &lt;code&gt;true&lt;/code&gt; if the specified value exists in the map.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-use-cases&quot;&gt;Example use cases&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-use-cases&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Check if a country code exists in a header list:&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;has_value(split(http.response.headers[&quot;x-allow-country&quot;][0], &quot;,&quot;), ip.src.country)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Check if a specific header key exists:&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;has_key(http.request.headers, &quot;x-custom-header&quot;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Join array values for logging or comparison:&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;txt&quot; data-nb-lang=&quot;txt&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;join(http.request.headers.names, &quot;, &quot;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ruleset-engine/rules-language/functions/&quot;&gt;Functions reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><product>Rules</product><category>Rules</category></item><item><title>Cloudflare Fundamentals, SDK - Cloudflare Typescript SDK v6.0.0-beta.1 now available</title><link>https://developers.cloudflare.com/changelog/post/2026-01-20-cloudflare-typescript-v6.0.0-beta.1/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-20-cloudflare-typescript-v6.0.0-beta.1/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; Please note that v6.0.0-beta.1 is in Beta and we are still testing it for stability.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Full Changelog: &lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript/compare/v5.2.0...v6.0.0-beta.1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;v5.2.0...v6.0.0-beta.1&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In this release, you&apos;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.&lt;/p&gt;
&lt;p&gt;Some breaking changes were introduced due to bug fixes, also listed below.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;breaking-changes&quot;&gt;Breaking Changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#breaking-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;addressing---parameter-requirements-changed&quot;&gt;Addressing - Parameter Requirements Changed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#addressing---parameter-requirements-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BGPPrefixCreateParams.cidr&lt;/code&gt;: optional → &lt;strong&gt;required&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PrefixCreateParams.asn&lt;/code&gt;: &lt;code&gt;number | null&lt;/code&gt; → &lt;code&gt;number&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PrefixCreateParams.loa_document_id&lt;/code&gt;: required → &lt;strong&gt;optional&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ServiceBindingCreateParams.cidr&lt;/code&gt;: optional → &lt;strong&gt;required&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ServiceBindingCreateParams.service_id&lt;/code&gt;: optional → &lt;strong&gt;required&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;api-gateway&quot;&gt;API Gateway&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#api-gateway&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ConfigurationUpdateResponse&lt;/code&gt; removed&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PublicSchema&lt;/code&gt; → &lt;code&gt;OldPublicSchema&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SchemaUpload&lt;/code&gt; → &lt;code&gt;UserSchemaCreateResponse&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ConfigurationUpdateParams.properties&lt;/code&gt; removed; use &lt;code&gt;normalize&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cloudforceone---response-type-changes&quot;&gt;CloudforceOne - Response Type Changes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cloudforceone---response-type-changes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ThreatEventBulkCreateResponse&lt;/code&gt;: &lt;code&gt;number&lt;/code&gt; → complex object with counts and errors&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;d1-database---query-parameters&quot;&gt;D1 Database - Query Parameters&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#d1-database---query-parameters&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DatabaseQueryParams&lt;/code&gt;: simple interface → union type (&lt;code&gt;D1SingleQuery | MultipleQueries&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DatabaseRawParams&lt;/code&gt;: same change&lt;/li&gt;
&lt;li&gt;Supports batch queries via &lt;code&gt;batch&lt;/code&gt; array&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;dns-records---type-renames-21-types&quot;&gt;DNS Records - Type Renames (21 types)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#dns-records---type-renames-21-types&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;All record type interfaces renamed from &lt;code&gt;*Record&lt;/code&gt; to short names:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.ARecord&lt;/code&gt; → &lt;code&gt;RecordResponse.A&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.AAAARecord&lt;/code&gt; → &lt;code&gt;RecordResponse.AAAA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.CNAMERecord&lt;/code&gt; → &lt;code&gt;RecordResponse.CNAME&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.MXRecord&lt;/code&gt; → &lt;code&gt;RecordResponse.MX&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.NSRecord&lt;/code&gt; → &lt;code&gt;RecordResponse.NS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.PTRRecord&lt;/code&gt; → &lt;code&gt;RecordResponse.PTR&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.TXTRecord&lt;/code&gt; → &lt;code&gt;RecordResponse.TXT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.CAARecord&lt;/code&gt; → &lt;code&gt;RecordResponse.CAA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.CERTRecord&lt;/code&gt; → &lt;code&gt;RecordResponse.CERT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.DNSKEYRecord&lt;/code&gt; → &lt;code&gt;RecordResponse.DNSKEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.DSRecord&lt;/code&gt; → &lt;code&gt;RecordResponse.DS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.HTTPSRecord&lt;/code&gt; → &lt;code&gt;RecordResponse.HTTPS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.LOCRecord&lt;/code&gt; → &lt;code&gt;RecordResponse.LOC&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.NAPTRRecord&lt;/code&gt; → &lt;code&gt;RecordResponse.NAPTR&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.SMIMEARecord&lt;/code&gt; → &lt;code&gt;RecordResponse.SMIMEA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.SRVRecord&lt;/code&gt; → &lt;code&gt;RecordResponse.SRV&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.SSHFPRecord&lt;/code&gt; → &lt;code&gt;RecordResponse.SSHFP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.SVCBRecord&lt;/code&gt; → &lt;code&gt;RecordResponse.SVCB&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.TLSARecord&lt;/code&gt; → &lt;code&gt;RecordResponse.TLSA&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.URIRecord&lt;/code&gt; → &lt;code&gt;RecordResponse.URI&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RecordResponse.OpenpgpkeyRecord&lt;/code&gt; → &lt;code&gt;RecordResponse.Openpgpkey&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;iam-resource-groups&quot;&gt;IAM Resource Groups&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#iam-resource-groups&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ResourceGroupCreateResponse.scope&lt;/code&gt;: optional single → &lt;strong&gt;required array&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ResourceGroupCreateResponse.id&lt;/code&gt;: optional → &lt;strong&gt;required&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;origin-ca-certificates---parameter-requirements-changed&quot;&gt;Origin CA Certificates - Parameter Requirements Changed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#origin-ca-certificates---parameter-requirements-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OriginCACertificateCreateParams.csr&lt;/code&gt;: optional → &lt;strong&gt;required&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OriginCACertificateCreateParams.hostnames&lt;/code&gt;: optional → &lt;strong&gt;required&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OriginCACertificateCreateParams.request_type&lt;/code&gt;: optional → &lt;strong&gt;required&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;pages&quot;&gt;Pages&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#pages&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Renamed: &lt;code&gt;DeploymentsSinglePage&lt;/code&gt; → &lt;code&gt;DeploymentListResponsesV4PagePaginationArray&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Domain response fields: many optional → &lt;strong&gt;required&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;pipelines---v0-to-v1-migration&quot;&gt;Pipelines - v0 to v1 Migration&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#pipelines---v0-to-v1-migration&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Entire v0 API deprecated; use v1 methods (&lt;code&gt;createV1&lt;/code&gt;, &lt;code&gt;listV1&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;New sub-resources: &lt;code&gt;Sinks&lt;/code&gt;, &lt;code&gt;Streams&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;r2&quot;&gt;R2&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#r2&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;EventNotificationUpdateParams.rules&lt;/code&gt;: optional → &lt;strong&gt;required&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Super Slurper: &lt;code&gt;bucket&lt;/code&gt;, &lt;code&gt;secret&lt;/code&gt; now required in source params&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;radar&quot;&gt;Radar&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#radar&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dataSource&lt;/code&gt;: &lt;code&gt;string&lt;/code&gt; → typed enum (23 values)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;eventType&lt;/code&gt;: &lt;code&gt;string&lt;/code&gt; → typed enum (6 values)&lt;/li&gt;
&lt;li&gt;V2 methods require &lt;code&gt;dimension&lt;/code&gt; parameter (breaking signature change)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;resource-sharing&quot;&gt;Resource Sharing&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#resource-sharing&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Removed: &lt;code&gt;status_message&lt;/code&gt; field from all recipient response types&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;schema-validation&quot;&gt;Schema Validation&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#schema-validation&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Consolidated &lt;code&gt;SchemaCreateResponse&lt;/code&gt;, &lt;code&gt;SchemaListResponse&lt;/code&gt;, &lt;code&gt;SchemaEditResponse&lt;/code&gt;, &lt;code&gt;SchemaGetResponse&lt;/code&gt; → &lt;code&gt;PublicSchema&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Renamed: &lt;code&gt;SchemaListResponsesV4PagePaginationArray&lt;/code&gt; → &lt;code&gt;PublicSchemasV4PagePaginationArray&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;spectrum&quot;&gt;Spectrum&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#spectrum&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Renamed union members: &lt;code&gt;AppListResponse.UnionMember0&lt;/code&gt; → &lt;code&gt;SpectrumConfigAppConfig&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Renamed union members: &lt;code&gt;AppListResponse.UnionMember1&lt;/code&gt; → &lt;code&gt;SpectrumConfigPaygoAppConfig&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;workers&quot;&gt;Workers&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#workers&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Removed: &lt;code&gt;WorkersBindingKindTailConsumer&lt;/code&gt; type (all occurrences)&lt;/li&gt;
&lt;li&gt;Renamed: &lt;code&gt;ScriptsSinglePage&lt;/code&gt; → &lt;code&gt;ScriptListResponsesSinglePage&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Removed: &lt;code&gt;DeploymentsSinglePage&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;zero-trust-dlp&quot;&gt;Zero-Trust DLP&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#zero-trust-dlp&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;datasets.create()&lt;/code&gt;, &lt;code&gt;update()&lt;/code&gt;, &lt;code&gt;get()&lt;/code&gt; return types changed&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PredefinedGetResponse&lt;/code&gt; union members renamed to &lt;code&gt;UnionMember0-5&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;zero-trust-tunnels&quot;&gt;Zero-Trust Tunnels&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#zero-trust-tunnels&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Removed: &lt;code&gt;CloudflaredCreateResponse&lt;/code&gt;, &lt;code&gt;CloudflaredListResponse&lt;/code&gt;, &lt;code&gt;CloudflaredDeleteResponse&lt;/code&gt;, &lt;code&gt;CloudflaredEditResponse&lt;/code&gt;, &lt;code&gt;CloudflaredGetResponse&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Removed: &lt;code&gt;CloudflaredListResponsesV4PagePaginationArray&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;features&quot;&gt;Features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;abuse-reports-clientabusereports&quot;&gt;Abuse Reports (&lt;code&gt;client.abuseReports&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#abuse-reports-clientabusereports&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reports&lt;/strong&gt;: &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mitigations&lt;/strong&gt;: sub-resource for abuse mitigations&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ai-search-clientaisearch&quot;&gt;AI Search (&lt;code&gt;client.aisearch&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ai-search-clientaisearch&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instances&lt;/strong&gt;: &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;stats&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Items&lt;/strong&gt;: &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jobs&lt;/strong&gt;: &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;, &lt;code&gt;logs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tokens&lt;/strong&gt;: &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, &lt;code&gt;read&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;connectivity-clientconnectivity&quot;&gt;Connectivity (&lt;code&gt;client.connectivity&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#connectivity-clientconnectivity&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Directory Services&lt;/strong&gt;: &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Supports IPv4, IPv6, dual-stack, and hostname configurations&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;organizations-clientorganizations&quot;&gt;Organizations (&lt;code&gt;client.organizations&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#organizations-clientorganizations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Organizations&lt;/strong&gt;: &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OrganizationProfile&lt;/strong&gt;: &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Hierarchical organization support with parent/child relationships&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;r2-data-catalog-clientr2datacatalog&quot;&gt;R2 Data Catalog (&lt;code&gt;client.r2DataCatalog&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#r2-data-catalog-clientr2datacatalog&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Catalog&lt;/strong&gt;: &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;enable&lt;/code&gt;, &lt;code&gt;disable&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Credentials&lt;/strong&gt;: &lt;code&gt;create&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MaintenanceConfigs&lt;/strong&gt;: &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Namespaces&lt;/strong&gt;: &lt;code&gt;list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tables&lt;/strong&gt;: &lt;code&gt;list&lt;/code&gt;, maintenance config management&lt;/li&gt;
&lt;li&gt;Apache Iceberg integration&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;realtime-kit-clientrealtimekit&quot;&gt;Realtime Kit (&lt;code&gt;client.realtimeKit&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#realtime-kit-clientrealtimekit&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Apps&lt;/strong&gt;: &lt;code&gt;get&lt;/code&gt;, &lt;code&gt;post&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Meetings&lt;/strong&gt;: &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;, participant management&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Livestreams&lt;/strong&gt;: 10+ methods for streaming&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recordings&lt;/strong&gt;: start, pause, stop, get&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sessions&lt;/strong&gt;: transcripts, summaries, chat&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Webhooks&lt;/strong&gt;: full CRUD&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ActiveSession&lt;/strong&gt;: polls, kick participants&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analytics&lt;/strong&gt;: organization analytics&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;token-validation-clienttokenvalidation&quot;&gt;Token Validation (&lt;code&gt;client.tokenValidation&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#token-validation-clienttokenvalidation&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Configuration&lt;/strong&gt;: &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, &lt;code&gt;edit&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Credentials&lt;/strong&gt;: &lt;code&gt;update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rules&lt;/strong&gt;: &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, &lt;code&gt;bulkCreate&lt;/code&gt;, &lt;code&gt;bulkEdit&lt;/code&gt;, &lt;code&gt;edit&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;JWT validation with RS256/384/512, PS256/384/512, ES256, ES384&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;alerting-silences-clientalertingsilences&quot;&gt;Alerting Silences (&lt;code&gt;client.alerting.silences&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#alerting-silences-clientalertingsilences&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;iam-sso-clientiamsso&quot;&gt;IAM SSO (&lt;code&gt;client.iam.sso&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#iam-sso-clientiamsso&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;, &lt;code&gt;beginVerification&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;pipelines-v1-clientpipelines&quot;&gt;Pipelines v1 (&lt;code&gt;client.pipelines&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#pipelines-v1-clientpipelines&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sinks&lt;/strong&gt;: &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streams&lt;/strong&gt;: &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, &lt;code&gt;get&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;zero-trust-ai-controls--mcp-clientzerotrustaccessaicontrolsmcp&quot;&gt;Zero-Trust AI Controls / MCP (&lt;code&gt;client.zeroTrust.access.aiControls.mcp&lt;/code&gt;)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#zero-trust-ai-controls--mcp-clientzerotrustaccessaicontrolsmcp&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Portals&lt;/strong&gt;: &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, &lt;code&gt;read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Servers&lt;/strong&gt;: &lt;code&gt;create&lt;/code&gt;, &lt;code&gt;update&lt;/code&gt;, &lt;code&gt;list&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt;, &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;sync&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;accounts&quot;&gt;Accounts&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#accounts&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;managed_by&lt;/code&gt; field with &lt;code&gt;parent_org_id&lt;/code&gt;, &lt;code&gt;parent_org_name&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;addressing-loa-documents&quot;&gt;Addressing LOA Documents&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#addressing-loa-documents&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;auto_generated&lt;/code&gt; field on &lt;code&gt;LOADocumentCreateResponse&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;addressing-prefixes&quot;&gt;Addressing Prefixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#addressing-prefixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;delegate_loa_creation&lt;/code&gt;, &lt;code&gt;irr_validation_state&lt;/code&gt;, &lt;code&gt;ownership_validation_state&lt;/code&gt;, &lt;code&gt;ownership_validation_token&lt;/code&gt;, &lt;code&gt;rpki_validation_state&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ai&quot;&gt;AI&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ai&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Added &lt;code&gt;toMarkdown.supported()&lt;/code&gt; method to get all supported conversion formats&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ai-gateway&quot;&gt;AI Gateway&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ai-gateway&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;zdr&lt;/code&gt; field added to all responses and params&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;alerting&quot;&gt;Alerting&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#alerting&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;New alert type: &lt;code&gt;abuse_report_alert&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type&lt;/code&gt; field added to PolicyFilter&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;browser-rendering&quot;&gt;Browser Rendering&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#browser-rendering&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ContentCreateParams&lt;/code&gt;: refined to discriminated union (&lt;code&gt;Variant0 | Variant1&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Split into URL-based and HTML-based parameter variants for better type safety&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;client-certificates&quot;&gt;Client Certificates&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#client-certificates&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;reactivate&lt;/code&gt; parameter in edit&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cloudforceone&quot;&gt;CloudforceOne&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cloudforceone&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ThreatEventCreateParams.indicatorType&lt;/code&gt;: required → optional&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hasChildren&lt;/code&gt; field added to all threat event response types&lt;/li&gt;
&lt;li&gt;&lt;code&gt;datasetIds&lt;/code&gt; query parameter on &lt;code&gt;AttackerListParams&lt;/code&gt;, &lt;code&gt;CategoryListParams&lt;/code&gt;, &lt;code&gt;TargetIndustryListParams&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;categoryUuid&lt;/code&gt; field on &lt;code&gt;TagCreateResponse&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;indicators&lt;/code&gt; array for multi-indicator support per event&lt;/li&gt;
&lt;li&gt;&lt;code&gt;uuid&lt;/code&gt; and &lt;code&gt;preserveUuid&lt;/code&gt; fields for UUID preservation in bulk create&lt;/li&gt;
&lt;li&gt;&lt;code&gt;format&lt;/code&gt; query parameter (&lt;code&gt;&apos;json&apos; | &apos;stix2&apos;&lt;/code&gt;) on &lt;code&gt;ThreatEventListParams&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;createdAt&lt;/code&gt;, &lt;code&gt;datasetId&lt;/code&gt; fields on &lt;code&gt;ThreatEventEditParams&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;content-scanning&quot;&gt;Content Scanning&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#content-scanning&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Added &lt;code&gt;create()&lt;/code&gt;, &lt;code&gt;update()&lt;/code&gt;, &lt;code&gt;get()&lt;/code&gt; methods&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;custom-pages&quot;&gt;Custom Pages&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#custom-pages&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;New page types: &lt;code&gt;basic_challenge&lt;/code&gt;, &lt;code&gt;under_attack&lt;/code&gt;, &lt;code&gt;waf_challenge&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;d1&quot;&gt;D1&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#d1&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;served_by_colo&lt;/code&gt; - colo that handled query&lt;/li&gt;
&lt;li&gt;&lt;code&gt;jurisdiction&lt;/code&gt; - &lt;code&gt;&apos;eu&apos; | &apos;fedramp&apos;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Time Travel&lt;/strong&gt; (&lt;code&gt;client.d1.database.timeTravel&lt;/code&gt;): &lt;code&gt;getBookmark()&lt;/code&gt;, &lt;code&gt;restore()&lt;/code&gt; - point-in-time recovery&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;email-security&quot;&gt;Email Security&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#email-security&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;New fields on &lt;code&gt;InvestigateListResponse&lt;/code&gt;/&lt;code&gt;InvestigateGetResponse&lt;/code&gt;: &lt;code&gt;envelope_from&lt;/code&gt;, &lt;code&gt;envelope_to&lt;/code&gt;, &lt;code&gt;postfix_id_outbound&lt;/code&gt;, &lt;code&gt;replyto&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;New detection classification: &lt;code&gt;&apos;outbound_ndr&apos;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Enhanced &lt;code&gt;Finding&lt;/code&gt; interface with &lt;code&gt;attachment&lt;/code&gt;, &lt;code&gt;detection&lt;/code&gt;, &lt;code&gt;field&lt;/code&gt;, &lt;code&gt;portion&lt;/code&gt;, &lt;code&gt;reason&lt;/code&gt;, &lt;code&gt;score&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;cursor&lt;/code&gt; query parameter to &lt;code&gt;InvestigateListParams&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;gateway-lists&quot;&gt;Gateway Lists&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#gateway-lists&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;New list types: &lt;code&gt;CATEGORY&lt;/code&gt;, &lt;code&gt;LOCATION&lt;/code&gt;, &lt;code&gt;DEVICE&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;intel&quot;&gt;Intel&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#intel&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;New issue type: &lt;code&gt;&apos;configuration_suggestion&apos;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;payload&lt;/code&gt; field: &lt;code&gt;unknown&lt;/code&gt; → typed &lt;code&gt;Payload&lt;/code&gt; interface with &lt;code&gt;detection_method&lt;/code&gt;, &lt;code&gt;zone_tag&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;leaked-credential-checks&quot;&gt;Leaked Credential Checks&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#leaked-credential-checks&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Added &lt;code&gt;detections.get()&lt;/code&gt; method&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;logpush&quot;&gt;Logpush&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#logpush&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;New datasets: &lt;code&gt;dex_application_tests&lt;/code&gt;, &lt;code&gt;dex_device_state_events&lt;/code&gt;, &lt;code&gt;ipsec_logs&lt;/code&gt;, &lt;code&gt;warp_config_changes&lt;/code&gt;, &lt;code&gt;warp_toggle_changes&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;load-balancers&quot;&gt;Load Balancers&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#load-balancers&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Monitor.port&lt;/code&gt;: &lt;code&gt;number&lt;/code&gt; → &lt;code&gt;number | null&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pool.load_shedding&lt;/code&gt;: &lt;code&gt;LoadShedding&lt;/code&gt; → &lt;code&gt;LoadShedding | null&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pool.origin_steering&lt;/code&gt;: &lt;code&gt;OriginSteering&lt;/code&gt; → &lt;code&gt;OriginSteering | null&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;magic-transit&quot;&gt;Magic Transit&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#magic-transit&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;license_key&lt;/code&gt; field on connectors&lt;/li&gt;
&lt;li&gt;&lt;code&gt;provision_license&lt;/code&gt; parameter for auto-provisioning&lt;/li&gt;
&lt;li&gt;IPSec: &lt;code&gt;custom_remote_identities&lt;/code&gt; with FQDN support&lt;/li&gt;
&lt;li&gt;Snapshots: Bond interface, &lt;code&gt;probed_mtu&lt;/code&gt; field&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;pages-1&quot;&gt;Pages&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#pages-1&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;New response types: &lt;code&gt;ProjectCreateResponse&lt;/code&gt;, &lt;code&gt;ProjectListResponse&lt;/code&gt;, &lt;code&gt;ProjectEditResponse&lt;/code&gt;, &lt;code&gt;ProjectGetResponse&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Deployment methods return specific response types instead of generic &lt;code&gt;Deployment&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;queues&quot;&gt;Queues&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#queues&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Added &lt;code&gt;subscriptions.get()&lt;/code&gt; method&lt;/li&gt;
&lt;li&gt;Enhanced &lt;code&gt;SubscriptionGetResponse&lt;/code&gt; with typed event source interfaces&lt;/li&gt;
&lt;li&gt;New event source types: Images, KV, R2, Vectorize, Workers AI, Workers Builds, Workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;r2-1&quot;&gt;R2&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#r2-1&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Sippy: new provider &lt;code&gt;s3&lt;/code&gt; (S3-compatible endpoints)&lt;/li&gt;
&lt;li&gt;Sippy: &lt;code&gt;bucketUrl&lt;/code&gt; field for S3-compatible sources&lt;/li&gt;
&lt;li&gt;Super Slurper: &lt;code&gt;keys&lt;/code&gt; field on source response schemas (specify specific keys to migrate)&lt;/li&gt;
&lt;li&gt;Super Slurper: &lt;code&gt;pathPrefix&lt;/code&gt; field on source schemas&lt;/li&gt;
&lt;li&gt;Super Slurper: &lt;code&gt;region&lt;/code&gt; field on S3 source params&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;radar-1&quot;&gt;Radar&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#radar-1&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Added &lt;code&gt;geolocations.list()&lt;/code&gt;, &lt;code&gt;geolocations.get()&lt;/code&gt; methods&lt;/li&gt;
&lt;li&gt;Added V2 dimension-based methods (&lt;code&gt;summaryV2&lt;/code&gt;, &lt;code&gt;timeseriesGroupsV2&lt;/code&gt;) to radar sub-resources&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;resource-sharing-1&quot;&gt;Resource Sharing&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#resource-sharing-1&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Added &lt;code&gt;terminal&lt;/code&gt; boolean field to Resource Error interfaces&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;rules&quot;&gt;Rules&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#rules&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Added &lt;code&gt;id&lt;/code&gt; field to &lt;code&gt;ItemDeleteParams.Item&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;rulesets&quot;&gt;Rulesets&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#rulesets&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;New buffering fields on &lt;code&gt;SetConfigRule&lt;/code&gt;: &lt;code&gt;request_body_buffering&lt;/code&gt;, &lt;code&gt;response_body_buffering&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;secrets-store&quot;&gt;Secrets Store&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#secrets-store&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;New scopes: &lt;code&gt;&apos;dex&apos;&lt;/code&gt;, &lt;code&gt;&apos;access&apos;&lt;/code&gt; (in addition to &lt;code&gt;&apos;workers&apos;&lt;/code&gt;, &lt;code&gt;&apos;ai_gateway&apos;&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ssl-certificate-packs&quot;&gt;SSL Certificate Packs&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ssl-certificate-packs&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Response types now proper interfaces (was &lt;code&gt;unknown&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Fields now required: &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;certificates&lt;/code&gt;, &lt;code&gt;hosts&lt;/code&gt;, &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;type&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;security-center&quot;&gt;Security Center&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#security-center&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;payload&lt;/code&gt; field: &lt;code&gt;unknown&lt;/code&gt; → typed &lt;code&gt;Payload&lt;/code&gt; interface with &lt;code&gt;detection_method&lt;/code&gt;, &lt;code&gt;zone_tag&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;shared-types&quot;&gt;Shared Types&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#shared-types&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Added: &lt;code&gt;CloudflareTunnelsV4PagePaginationArray&lt;/code&gt; pagination class&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;workers-1&quot;&gt;Workers&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#workers-1&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Added &lt;code&gt;subdomains.delete()&lt;/code&gt; method&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Worker.references&lt;/code&gt; - track external dependencies (domains, Durable Objects, queues)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Worker.startup_time_ms&lt;/code&gt; - startup timing&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Script.observability&lt;/code&gt; - observability settings with logging&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Script.tag&lt;/code&gt;, &lt;code&gt;Script.tags&lt;/code&gt; - immutable ID and tags&lt;/li&gt;
&lt;li&gt;Placement: support for region, hostname, host-based placement&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tags&lt;/code&gt;, &lt;code&gt;tail_consumers&lt;/code&gt; now accept &lt;code&gt;| null&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Telemetry: &lt;code&gt;traces&lt;/code&gt; field, &lt;code&gt;$containers&lt;/code&gt; event info, &lt;code&gt;durableObjectId&lt;/code&gt;, &lt;code&gt;transactionName&lt;/code&gt;, &lt;code&gt;abr_level&lt;/code&gt; fields&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;workers-for-platforms&quot;&gt;Workers for Platforms&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#workers-for-platforms&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ScriptUpdateResponse&lt;/code&gt;: new fields &lt;code&gt;entry_point&lt;/code&gt;, &lt;code&gt;observability&lt;/code&gt;, &lt;code&gt;tag&lt;/code&gt;, &lt;code&gt;tags&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;placement&lt;/code&gt; field now union of 4 variants (smart mode, region, hostname, host)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tags&lt;/code&gt;, &lt;code&gt;tail_consumers&lt;/code&gt; now nullable&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TagUpdateParams.body&lt;/code&gt; now accepts &lt;code&gt;null&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;workflows&quot;&gt;Workflows&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#workflows&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;instance_retention&lt;/code&gt;: &lt;code&gt;unknown&lt;/code&gt; → typed &lt;code&gt;InstanceRetention&lt;/code&gt; interface with &lt;code&gt;error_retention&lt;/code&gt;, &lt;code&gt;success_retention&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;New status option: &lt;code&gt;&apos;restart&apos;&lt;/code&gt; added to &lt;code&gt;StatusEditParams.status&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;zero-trust-devices&quot;&gt;Zero-Trust Devices&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#zero-trust-devices&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;External emergency disconnect settings (4 new fields)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;antivirus&lt;/code&gt; device posture check type&lt;/li&gt;
&lt;li&gt;&lt;code&gt;os_version_extra&lt;/code&gt; documentation improvements&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;zones&quot;&gt;Zones&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#zones&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;New response types: &lt;code&gt;SubscriptionCreateResponse&lt;/code&gt;, &lt;code&gt;SubscriptionUpdateResponse&lt;/code&gt;, &lt;code&gt;SubscriptionGetResponse&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;zero-trust-access-applications&quot;&gt;Zero-Trust Access Applications&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#zero-trust-access-applications&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;New &lt;code&gt;ApplicationType&lt;/code&gt; values: &lt;code&gt;&apos;mcp&apos;&lt;/code&gt;, &lt;code&gt;&apos;mcp_portal&apos;&lt;/code&gt;, &lt;code&gt;&apos;proxy_endpoint&apos;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;New destination type: &lt;code&gt;ViaMcpServerPortalDestination&lt;/code&gt; for MCP server access&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;zero-trust-gateway&quot;&gt;Zero-Trust Gateway&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#zero-trust-gateway&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Added &lt;code&gt;rules.listTenant()&lt;/code&gt; method&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;zero-trust-gateway---proxy-endpoints&quot;&gt;Zero-Trust Gateway - Proxy Endpoints&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#zero-trust-gateway---proxy-endpoints&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ProxyEndpoint&lt;/code&gt;: interface → discriminated union (&lt;code&gt;ZeroTrustGatewayProxyEndpointIP | ZeroTrustGatewayProxyEndpointIdentity&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ProxyEndpointCreateParams&lt;/code&gt;: interface → union type&lt;/li&gt;
&lt;li&gt;Added &lt;code&gt;kind&lt;/code&gt; field: &lt;code&gt;&apos;ip&apos; | &apos;identity&apos;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;zero-trust-tunnels-1&quot;&gt;Zero-Trust Tunnels&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#zero-trust-tunnels-1&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;WARPConnector*Response&lt;/code&gt;: union type → interface&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;deprecations&quot;&gt;Deprecations&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#deprecations&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;API Gateway&lt;/strong&gt;: &lt;code&gt;UserSchemas&lt;/code&gt;, &lt;code&gt;Settings&lt;/code&gt;, &lt;code&gt;SchemaValidation&lt;/code&gt; resources&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit Logs&lt;/strong&gt;: &lt;code&gt;auditLogId.not&lt;/code&gt; (use &lt;code&gt;id.not&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CloudforceOne&lt;/strong&gt;: &lt;code&gt;ThreatEvents.get()&lt;/code&gt;, &lt;code&gt;IndicatorTypes.list()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Devices&lt;/strong&gt;: &lt;code&gt;public_ip&lt;/code&gt; field (use DEX API)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Email Security&lt;/strong&gt;: &lt;code&gt;item_count&lt;/code&gt; field in Move responses&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pipelines&lt;/strong&gt;: v0 methods (use v1)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Radar&lt;/strong&gt;: old &lt;code&gt;summary()&lt;/code&gt; and &lt;code&gt;timeseriesGroups()&lt;/code&gt; methods (use V2)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rulesets&lt;/strong&gt;: &lt;code&gt;disable_apps&lt;/code&gt;, &lt;code&gt;mirage&lt;/code&gt; fields&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WARP Connector&lt;/strong&gt;: &lt;code&gt;connections&lt;/code&gt; field&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workers&lt;/strong&gt;: &lt;code&gt;environment&lt;/code&gt; parameter in Domains&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zones&lt;/strong&gt;: &lt;code&gt;ResponseBuffering&lt;/code&gt; page rule&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;bug-fixes&quot;&gt;Bug Fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bug-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;mcp:&lt;/strong&gt; correct code tool API endpoint (&lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript/commit/599703c45672dc899455d74b124018efd4b75095&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;599703c&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mcp:&lt;/strong&gt; return correct lines on typescript errors (&lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript/commit/5d6f9998ed9999aaa95e1bda8cf50929f3555cf1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;5d6f999&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;organization_profile:&lt;/strong&gt; fix bad reference (&lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript/commit/d84ea77094400055c06554812b84c2f0c8d00cc4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;d84ea77&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;schema_validation:&lt;/strong&gt; correctly reflect model to openapi mapping (&lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript/commit/bb861516774b159d80e0f46a5f3abc5a4c9f9d49&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;bb86151&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers:&lt;/strong&gt; fix tests (&lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript/commit/2ee37f7adf5a4637d65f61fc225e135eec2579fc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2ee37f7&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;documentation&quot;&gt;Documentation&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#documentation&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Added deprecation notices with migration paths&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;api_gateway:&lt;/strong&gt; deprecate API Shield Schema Validation resources (&lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript/commit/8a4b20f7a572422f74179fbdb4f1c4fb555e3e40&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;8a4b20f&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Improved JSDoc examples across all resources&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers:&lt;/strong&gt; expose subdomain delete documentation (&lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript/commit/4f7cc1f2b8861a5b8abc193d287f78264a425062&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;4f7cc1f&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>SDK</category></item><item><title>Cloudflare Fundamentals, Terraform - Terraform v5.16.0 now available</title><link>https://developers.cloudflare.com/changelog/post/2026-01-20-terraform-v5.16.0-provider/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-20-terraform-v5.16.0-provider/</guid><description>&lt;p&gt;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&apos;ve established a consistent and rapid &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/5774&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2-3 week cadence&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; for releasing targeted improvements, demonstrating our commitment to stability and reliability.&lt;/p&gt;
&lt;p&gt;With the help of the community, we have a growing number of resources that we have marked as &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;stable&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, with that list continuing to grow with every release. The most used &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;resources&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Thank you for continuing to raise issues. They make our provider stronger and help us build products that reflect your needs.&lt;/p&gt;
&lt;p&gt;This release includes bug fixes, the stabilization of even more popular resources, and more.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;features&quot;&gt;Features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;custom_pages:&lt;/strong&gt; add &quot;waf_challenge&quot; as new supported error page type identifier in both resource and data source schemas&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;list:&lt;/strong&gt; enhance CIDR validator to check for normalized CIDR notation requiring network address for IPv4 and IPv6&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;magic_wan_gre_tunnel:&lt;/strong&gt; add automatic_return_routing attribute for automatic routing control&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;magic_wan_gre_tunnel:&lt;/strong&gt; add BGP configuration support with new BGP model attribute&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;magic_wan_gre_tunnel:&lt;/strong&gt; add bgp_status computed attribute for BGP connection status information&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;magic_wan_gre_tunnel:&lt;/strong&gt; enhance schema with BGP-related attributes and validators&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;magic_wan_ipsec_tunnel:&lt;/strong&gt; add automatic_return_routing attribute for automatic routing control&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;magic_wan_ipsec_tunnel:&lt;/strong&gt; add BGP configuration support with new BGP model attribute&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;magic_wan_ipsec_tunnel:&lt;/strong&gt; add bgp_status computed attribute for BGP connection status information&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;magic_wan_ipsec_tunnel:&lt;/strong&gt; add custom_remote_identities attribute for custom identity configuration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;magic_wan_ipsec_tunnel:&lt;/strong&gt; enhance schema with BGP and identity-related attributes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ruleset:&lt;/strong&gt; add request body buffering support&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ruleset:&lt;/strong&gt; enhance ruleset data source with additional configuration options&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_script:&lt;/strong&gt; add observability logs attributes to list data source model&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_script:&lt;/strong&gt; enhance list data source schema with additional configuration options&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;bug-fixes&quot;&gt;Bug Fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bug-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;account_member&lt;/strong&gt;: fix resource importability issues&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dns_record:&lt;/strong&gt; remove unnecessary fmt.Sprintf wrapper around LoadTestCase call in test configuration helper function&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;load_balancer:&lt;/strong&gt; fix session_affinity_ttl type expectations to match Float64 in initial creation and Int64 after migration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_kv:&lt;/strong&gt; handle special characters correctly in URL encoding&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;documentation&quot;&gt;Documentation&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#documentation&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;account_subscription:&lt;/strong&gt; update schema description for rate_plan.sets attribute to clarify it returns an array of strings&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;api_shield:&lt;/strong&gt; add resource-level description for API Shield management of auth ID characteristics&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;api_shield:&lt;/strong&gt; enhance auth_id_characteristics.name attribute description to include JWT token configuration format requirements&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;api_shield:&lt;/strong&gt; specify JSONPath expression format for JWT claim locations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hyperdrive_config:&lt;/strong&gt; add description attribute to name attribute explaining its purpose in dashboard and API identification&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hyperdrive_config:&lt;/strong&gt; apply description improvements across resource, data source, and list data source schemas&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hyperdrive_config:&lt;/strong&gt; improve schema descriptions for cache settings to clarify default values&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hyperdrive_config:&lt;/strong&gt; update port description to clarify defaults for different database types&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;for-more-information&quot;&gt;For more information&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#for-more-information&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Terraform Provider&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/terraform/&quot;&gt;Documentation on using Terraform with Cloudflare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;List of stabilized resources&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>Terraform</category></item><item><title>WAF - WAF Release - 2026-01-20</title><link>https://developers.cloudflare.com/changelog/post/2026-01-20-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-20-waf-release/</guid><description>
&lt;p&gt;This week&apos;s release focuses on improvements to existing detections to enhance coverage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Existing rule enhancements have been deployed to improve detection resilience against SQL injection.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;a291bd530fa346d18cc1ce5a68d90c8f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...68d90c8f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Comment - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule is merged into the original rule &quot;SQLi - Comment&quot; (ID: &lt;rule-id id=&quot;42c424998d2a42c9808ab49c6d8d8fe4&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...6d8d8fe4&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;da289f9e692e4f5397d915fbfaa045cf&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...faa045cf&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;p&gt;&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;SQLi - Comparison - Beta&lt;/td&gt;
&lt;td&gt;Log&lt;/td&gt;
&lt;td&gt;Block&lt;/td&gt;&lt;br&gt;
&lt;td&gt;This rule is merged into the original rule &quot;SQLi - Comparison&quot; (ID: &lt;rule-id id=&quot;8166da327a614849bfa29317e7907480&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...e7907480&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/p&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - Use auxiliary Workers alongside full-stack frameworks</title><link>https://developers.cloudflare.com/changelog/post/2026-01-20-auxiliary-workers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-20-auxiliary-workers/</guid><description>&lt;p&gt;Auxiliary Workers are now fully supported when using full-stack frameworks, such as &lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/react-router/&quot;&gt;React Router&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/tanstack-start/&quot;&gt;TanStack Start&lt;/a&gt;, that integrate with the &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/reference/api/&quot;&gt;Cloudflare Vite plugin&lt;/a&gt;.
They are included alongside the framework&apos;s build output in the build output directory.
Note that this feature requires Vite 7 or above.&lt;/p&gt;
&lt;p&gt;Auxiliary Workers are additional Workers that can be called via &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/&quot;&gt;service bindings&lt;/a&gt; from your main (entry) Worker.
They are defined in the plugin config, as in the example below:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;vite.config.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { defineConfig } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;vite&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { tanstackStart } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@tanstack/react-start/plugin/vite&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { cloudflare } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/vite-plugin&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineConfig&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	plugins: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		tanstackStart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		cloudflare&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			viteEnvironment: { name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ssr&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			auxiliaryWorkers: [{ configPath: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./wrangler.aux.jsonc&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;See the Vite plugin &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/reference/api/&quot;&gt;API docs&lt;/a&gt; for more info.&lt;/p&gt;</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Import SQL files as additional modules by default</title><link>https://developers.cloudflare.com/changelog/post/2026-01-20-sql-module-rule/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-20-sql-module-rule/</guid><description>&lt;p&gt;The &lt;code&gt;.sql&lt;/code&gt; file extension is now automatically configured to be importable in your Worker code when using &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/bundling/#including-non-javascript-modules&quot;&gt;Wrangler&lt;/a&gt; or the &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/reference/non-javascript-modules/&quot;&gt;Cloudflare Vite plugin&lt;/a&gt;.
This is particular useful for importing migrations in Durable Objects and means you no longer need to configure custom rules when using &lt;a href=&quot;https://orm.drizzle.team/docs/connect-cloudflare-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Drizzle&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;SQL files are imported as JavaScript strings:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// `example` will be a JavaScript string&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; example &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;./example.sql&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><pubDate>Tue, 20 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare Fundamentals - Enhanced HTTP/3 request cancellation visibility</title><link>https://developers.cloudflare.com/changelog/post/2026-01-19-http3-499-reporting-improvement/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-19-http3-499-reporting-improvement/</guid><description>&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;enhanced-http3-request-cancellation-visibility&quot;&gt;Enhanced HTTP/3 request cancellation visibility&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#enhanced-http3-request-cancellation-visibility&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;200&lt;/code&gt; or a timeout-related code) rather than reflecting the client cancellation.&lt;/p&gt;
&lt;p&gt;Now, Cloudflare terminates cancelled HTTP/3 requests immediately and accurately logs them with a &lt;code&gt;499&lt;/code&gt; status code.&lt;/p&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;better-observability-for-client-behavior&quot;&gt;Better observability for client behavior&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#better-observability-for-client-behavior&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When HTTP/3 clients cancel requests, Cloudflare now immediately reflects this in your logs with a &lt;code&gt;499&lt;/code&gt; status code. This gives you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;More accurate traffic analysis&lt;/strong&gt;: Understand exactly when and how often clients cancel requests.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clearer debugging&lt;/strong&gt;: Distinguish between true errors and intentional client cancellations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better availability metrics&lt;/strong&gt;: Separate client-initiated cancellations from server-side issues.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;reduced-origin-load&quot;&gt;Reduced origin load&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#reduced-origin-load&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Cloudflare now terminates cancelled requests faster, which means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Less wasted compute&lt;/strong&gt;: Your origin no longer processes requests that clients have already abandoned.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lower bandwidth usage&lt;/strong&gt;: Responses are no longer generated and transmitted for cancelled requests.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved efficiency&lt;/strong&gt;: Resources are freed up to handle active requests.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-to-expect-in-your-logs&quot;&gt;What to expect in your logs&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-to-expect-in-your-logs&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You may notice an increase in &lt;code&gt;499&lt;/code&gt; status codes for HTTP/3 traffic. For HTTP/3, a &lt;code&gt;499&lt;/code&gt; indicates the client &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc9114#section-4.1.1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;cancelled the request stream&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; before receiving a complete response — the underlying connection may remain open. This is a normal part of web traffic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tip&lt;/strong&gt;: If you use &lt;code&gt;499&lt;/code&gt; 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.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/support/troubleshooting/http-status-codes/4xx-client-error/error-499/&quot;&gt;Error 499&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Magic Transit, Cloudflare Network Firewall, Cloudflare WAN, Network Flow - Network Services navigation update</title><link>https://developers.cloudflare.com/changelog/post/2026-01-15-networking-navigation-update/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-15-networking-navigation-update/</guid><description>&lt;p&gt;The Network Services menu structure in Cloudflare&apos;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.&lt;/p&gt;
&lt;p&gt;Your existing configurations will remain the same, and you will have access to all of the same features and functionality.&lt;/p&gt;
&lt;p&gt;The changes visible in your dashboard may vary based on the products you use. Overall, changes relate to &lt;a href=&quot;https://developers.cloudflare.com/magic-transit/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Magic Transit&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/magic-wan/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Magic WAN&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-network-firewall/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Magic Firewall&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Summary of changes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A new &lt;strong&gt;Overview&lt;/strong&gt; page provides access to the most common tasks across Magic Transit and Magic WAN.&lt;/li&gt;
&lt;li&gt;Product names have been removed from top-level navigation.&lt;/li&gt;
&lt;li&gt;Magic Transit and Magic WAN configuration is now organized under &lt;strong&gt;Routes&lt;/strong&gt; and &lt;strong&gt;Connectors&lt;/strong&gt;. For example, you will find IP Prefixes under &lt;strong&gt;Routes&lt;/strong&gt;, and your GRE/IPsec Tunnels under &lt;strong&gt;Connectors.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Magic Firewall policies are now called &lt;strong&gt;Firewall Policies.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Magic WAN Connectors and Connector On-Ramps are now referenced in the dashboard as &lt;strong&gt;Appliances&lt;/strong&gt; and &lt;strong&gt;Appliance profiles.&lt;/strong&gt; They can be found under &lt;strong&gt;Connectors &amp;gt; Appliances.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Network analytics, network health, and real-time analytics are now available under &lt;strong&gt;Insights.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Packet Captures are found under &lt;strong&gt;Insights &amp;gt; Diagnostics.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You can manage your Sites from &lt;strong&gt;Insights &amp;gt; Network health.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;You can find Magic Network Monitoring under &lt;strong&gt;Insights &amp;gt; Network flow&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you would like to provide feedback, complete &lt;a href=&quot;https://forms.gle/htWyjRsTjw1usdis5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;this form&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. You can also find these details in the January 7, 2026 email titled &lt;strong&gt;[FYI] Upcoming Network Services Dashboard Navigation Update&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Preview:
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3000,height=1052,format=webp/_astro/networking-overview-and-navigation.CeMgEFaZ.png&quot; alt=&quot;Networking Navigation&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3000&quot; height=&quot;1052&quot;&gt;&lt;/p&gt;</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><product>Magic Transit</product><category>Magic Transit</category><category>Cloudflare Network Firewall</category><category>Cloudflare WAN</category><category>Network Flow</category></item><item><title>Risk Score - Support for CrowdStrike device scores in User Risk Scoring</title><link>https://developers.cloudflare.com/changelog/post/2026-1-15-crowdstrike-score/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-1-15-crowdstrike-score/</guid><description>&lt;p&gt;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/).&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;New risk behaviors
The following risk scoring behaviors are now available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CrowdStrike low device score: Automatically increases a user&apos;s risk score when the connected device reports a &quot;Low&quot; score from CrowdStrike.&lt;/li&gt;
&lt;li&gt;CrowdStrike medium device score: Automatically increases a user&apos;s risk score when the connected device reports a &quot;Medium&quot; score from CrowdStrike.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These scores are derived from [CrowdStrike device posture attributes] (/cloudflare-one/integrations/service-providers/crowdstrike/#device-posture-attributes), including OS signals and sensor configurations.&lt;/p&gt;</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><product>Risk Score</product><category>Risk Score</category></item><item><title>Cloudflare Tunnel, Cloudflare Tunnel for SASE - Verify WARP Connector connectivity with a simple ping</title><link>https://developers.cloudflare.com/changelog/post/2026-01-15-warp-connector-ping-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-15-warp-connector-ping-support/</guid><description>&lt;p&gt;We have made it easier to validate connectivity when deploying &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;WARP Connector&lt;/a&gt; as part of your &lt;a href=&quot;https://developers.cloudflare.com/reference-architecture/architectures/sase/#connecting-networks&quot;&gt;software-defined private network&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can now &lt;code&gt;ping&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;Starting with &lt;a href=&quot;https://developers.cloudflare.com/changelog/2026-01-13-warp-linux-ga/&quot;&gt;version 2025.10.186.0&lt;/a&gt;, WARP Connector responds to traffic addressed to its own LAN IP, giving you immediate visibility into Connector reachability.&lt;/p&gt;
&lt;p&gt;Learn more about deploying &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;WARP Connector&lt;/a&gt; and building private network connectivity with &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/&quot;&gt;Cloudflare One&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><product>Cloudflare Tunnel</product><category>Cloudflare Tunnel</category><category>Cloudflare Tunnel for SASE</category></item><item><title>WAF - WAF Release - 2026-01-15</title><link>https://developers.cloudflare.com/changelog/post/2026-01-15-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-15-waf-release/</guid><description>
&lt;p&gt;This week&apos;s release focuses on improvements to existing detections to enhance coverage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Existing rule enhancements have been deployed to improve detection resilience against SQL Injection.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;eb3f44c07266448b9fa54ee7ad7dad3e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ad7dad3e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - String Function - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule is merged into the original rule &quot;SQLi - String Function&quot; (ID: &lt;rule-id id=&quot;63e03eecddfc4b3fb0cad587d32b798c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d32b798c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;adf076af09b2484ca9e7881f9e553ad3&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...9e553ad3&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;p&gt;&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;SQLi - Sub Query - Beta&lt;/td&gt;
&lt;td&gt;Log&lt;/td&gt;
&lt;td&gt;Block&lt;/td&gt;&lt;br&gt;
&lt;td&gt;This rule is merged into the original rule &quot;SQLi - Sub Query&quot; (ID: &lt;rule-id id=&quot;6ec5ecf52c094330aff99a38743e66b1&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...743e66b1&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/p&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers AI - Launching FLUX.2 [klein] 4B on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2026-01-15-flux-2-klein-4b-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-15-flux-2-klein-4b-workers-ai/</guid><description>&lt;p&gt;We&apos;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.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://bfl.ai/blog&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BFL blog&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to learn more about the model itself, or try it out yourself on our &lt;a href=&quot;https://multi-modal.ai.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;multi modal playground&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pricing documentation is available on the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/flux-2-klein-4b/&quot;&gt;model page&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing page&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;workers-ai-platform-specifics&quot;&gt;Workers AI Platform specifics&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#workers-ai-platform-specifics&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The model hosted on Workers AI is optimized for speed with a &lt;strong&gt;fixed 4-step inference process&lt;/strong&gt; and supports up to 4 image inputs. Since this is a distilled model, the &lt;code&gt;steps&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;With the REST API, the multipart form data input looks like this:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --url&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-klein-4b&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer {TOKEN}&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: multipart/form-data&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --form&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;prompt=a sunset at the alps&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --form&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; width=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1024&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --form&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; height=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1024&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;With the Workers AI binding, you can use it as such:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; form&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; FormData&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;prompt&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;a sunset with a dog&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;width&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;1024&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;height&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;1024&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// FormData doesn&apos;t expose its serialized body or boundary. Passing it to a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Request (or Response) constructor serializes it and generates the Content-Type&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// header with the boundary, which is required for the server to parse the multipart fields.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formResponse&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(form);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formStream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; formResponse.body;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formContentType&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; formResponse.headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;content-type&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; resp&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/black-forest-labs/flux-2-klein-4b&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	multipart: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		body: formStream,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		contentType: formContentType,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;The parameters you can send to the model are detailed here:&lt;/p&gt;
&lt;details&gt;&lt;p&gt;&lt;summary&gt;JSON Schema for Model&lt;/summary&gt;
&lt;strong&gt;Required Parameters&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;prompt&lt;/code&gt; (string) - Text description of the image to generate&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Optional Parameters&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input_image_0&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_1&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_2&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_3&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;guidance&lt;/code&gt; (float) - Guidance scale for generation. Higher values follow the prompt more closely&lt;/li&gt;
&lt;li&gt;&lt;code&gt;width&lt;/code&gt; (integer) - Width of the image, default &lt;code&gt;1024&lt;/code&gt; Range: 256-1920&lt;/li&gt;
&lt;li&gt;&lt;code&gt;height&lt;/code&gt; (integer) - Height of the image, default &lt;code&gt;768&lt;/code&gt; Range: 256-1920&lt;/li&gt;
&lt;li&gt;&lt;code&gt;seed&lt;/code&gt; (integer) - Seed for reproducibility&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Since this is a distilled model, the &lt;code&gt;steps&lt;/code&gt; parameter is fixed at 4 and cannot be adjusted.&lt;/p&gt;&lt;/details&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;plaintext&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot; data-nb-lang=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;## Multi-Reference Images&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;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.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;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`.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;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.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;```bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;curl --request POST \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --url &apos;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-klein-4b&apos; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --header &apos;Authorization: Bearer {TOKEN}&apos; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --header &apos;Content-Type: multipart/form-data&apos; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --form &apos;prompt=take the subject of image 1 and style it like image 0&apos; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --form input_image_0=@/Users/johndoe/Desktop/icedoutkeanu.png \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --form input_image_1=@/Users/johndoe/Desktop/me.png \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --form width=1024 \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --form height=1024&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Through Workers AI Binding:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//helper function to convert ReadableStream to Blob&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; function&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamToBlob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;stream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ReadableStream&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;contentType&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Blob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; reader&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stream.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getReader&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; chunks&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  while&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; reader.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (done) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    chunks.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(value);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Blob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(chunks, { type: contentType });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; image0&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;http://image-url&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; image1&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;http://image-url&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; form&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; FormData&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; image_blob0&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamToBlob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(image0.body, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;image/png&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; image_blob1&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamToBlob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(image1.body, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;image/png&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;input_image_0&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, image_blob0)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;input_image_1&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, image_blob1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;prompt&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;take the subject of image 1 and style it like image 0&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// FormData doesn&apos;t expose its serialized body or boundary. Passing it to a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Request (or Response) constructor serializes it and generates the Content-Type&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// header with the boundary, which is required for the server to parse the multipart fields.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formResponse&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(form);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formStream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; formResponse.body;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formContentType&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; formResponse.headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;content-type&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; resp&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/black-forest-labs/flux-2-klein-4b&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    multipart: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        body: formStream,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        contentType: formContentType&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><pubDate>Thu, 15 Jan 2026 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Security Center - URL Scanner now supports PDF report downloads</title><link>https://developers.cloudflare.com/changelog/post/2026-01-14-Download-URL-Scanner-Report-PDF/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-14-Download-URL-Scanner-Report-PDF/</guid><description>&lt;p&gt;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 &lt;strong&gt;PDF report&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Benefits:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Consolidate scan results, including screenshots, security signatures, and metadata, into a single, portable document&lt;/li&gt;
&lt;li&gt;Easily share professional-grade summaries with non-technical stakeholders or legal teams for faster incident response&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;What’s new:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PDF Export Button:&lt;/strong&gt; A new download option is available in the URL Scanner results page within the Cloudflare dashboard&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unified Documentation:&lt;/strong&gt; Access all scan details—from high-level summaries to specific security flags—in one offline-friendly file&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started with the URL Scanner and explore our reporting capabilities, visit the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/url_scanner/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;URL Scanner API documentation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;</description><pubDate>Wed, 14 Jan 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Cloudflare One Client - WARP client for Windows (version 2025.10.186.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-01-13-warp-windows-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-13-warp-windows-ga/</guid><description>&lt;p&gt;A new GA release for the Windows WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/emergency-disconnect/#set-up-external-emergency-disconnect&quot;&gt;external signal&lt;/a&gt;, and a new WARP client device posture check for &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/warp-client-checks/antivirus/&quot;&gt;Antivirus&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added a new feature to manage WARP client connectivity for all devices using an &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/emergency-disconnect/#set-up-external-emergency-disconnect&quot;&gt;external signal&lt;/a&gt;. 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.&lt;/li&gt;
&lt;li&gt;Fixed an issue that caused occasional audio degradation and increased CPU usage on Windows by optimizing route configurations for large &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/split-tunnels/#domain-based-split-tunnels&quot;&gt;domain-based split tunnel rules&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/&quot;&gt;Local Domain Fallback&lt;/a&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode&quot;&gt;Proxy mode&lt;/a&gt; now supports transparent HTTP proxying in addition to CONNECT-based proxying.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Added support for a new WARP client device posture check for &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/warp-client-checks/antivirus/&quot;&gt;Antivirus&lt;/a&gt;. 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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd&quot;&gt;Windows 11 24H2 KB5062553&lt;/a&gt; or higher for resolution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Devices with KB5055523 installed may receive a warning about &lt;code&gt;Win32/ClickFix.ABA&lt;/code&gt; being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to &lt;a href=&quot;https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0&quot;&gt;version 1.429.19.0&lt;/a&gt; or later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS resolution may be broken when the following conditions are all true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.&lt;/li&gt;
&lt;li&gt;A custom DNS server address is configured on the primary network adapter.&lt;/li&gt;
&lt;li&gt;The custom DNS server address on the primary network adapter is changed while WARP is connected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To work around this issue, reconnect the WARP client by toggling off and back on.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 13 Jan 2026 15:48:19 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - WARP client for macOS (version 2025.10.186.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-01-13-warp-macos-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-13-warp-macos-ga/</guid><description>&lt;p&gt;A new GA release for the macOS WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/emergency-disconnect/#set-up-external-emergency-disconnect&quot;&gt;external signal&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/&quot;&gt;Local Domain Fallback&lt;/a&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode&quot;&gt;Proxy mode&lt;/a&gt; now supports transparent HTTP proxying in addition to CONNECT-based proxying.&lt;/li&gt;
&lt;li&gt;Added a new feature to manage WARP client connectivity for all devices using an &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/emergency-disconnect/#set-up-external-emergency-disconnect&quot;&gt;external signal&lt;/a&gt;. 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.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 13 Jan 2026 15:48:17 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - WARP client for Linux (version 2025.10.186.0)</title><link>https://developers.cloudflare.com/changelog/post/2026-01-13-warp-linux-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-13-warp-linux-ga/</guid><description>&lt;p&gt;A new GA release for the Linux WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/emergency-disconnect/#set-up-external-emergency-disconnect&quot;&gt;external signal&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://pkg.cloudflareclient.com&quot;&gt;pkg.cloudflareclient.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/&quot;&gt;Local Domain Fallback&lt;/a&gt; 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.&lt;/li&gt;
&lt;li&gt;Linux &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/warp-client-checks/disk-encryption/&quot;&gt;disk encryption posture check&lt;/a&gt; now supports non-filesystem encryption types like &lt;code&gt;dm-crypt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode&quot;&gt;Proxy mode&lt;/a&gt; now supports transparent HTTP proxying in addition to CONNECT-based proxying.&lt;/li&gt;
&lt;li&gt;Fixed an issue where the GUI becomes unresponsive when the &lt;strong&gt;Re-Authenticate in browser&lt;/strong&gt; button is clicked.&lt;/li&gt;
&lt;li&gt;Added a new feature to manage WARP client connectivity for all devices using an &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/emergency-disconnect/#set-up-external-emergency-disconnect&quot;&gt;external signal&lt;/a&gt;. 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.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 13 Jan 2026 01:53:14 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>AI Crawl Control - AI Crawl Control Read Only role now available</title><link>https://developers.cloudflare.com/changelog/post/2026-01-13-ai-crawl-control-read-only-role/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-13-ai-crawl-control-read-only-role/</guid><description>&lt;p&gt;Account administrators can now assign the &lt;strong&gt;AI Crawl Control Read Only&lt;/strong&gt; role to provide read-only access to AI Crawl Control at the domain level.&lt;/p&gt;
&lt;p&gt;Users with this role can view the &lt;strong&gt;Overview&lt;/strong&gt;, &lt;strong&gt;Crawlers&lt;/strong&gt;, &lt;strong&gt;Metrics&lt;/strong&gt;, &lt;strong&gt;Robots.txt&lt;/strong&gt;, and &lt;strong&gt;Settings&lt;/strong&gt; tabs but cannot modify crawler actions or settings.&lt;/p&gt;
&lt;p&gt;This role is specific for AI Crawl Control. You still require correct permissions to access other areas / features of the dashboard.&lt;/p&gt;
&lt;p&gt;To assign, go to &lt;strong&gt;Manage Account&lt;/strong&gt; &amp;gt; &lt;strong&gt;Members&lt;/strong&gt; and add a policy with the &lt;strong&gt;AI Crawl Control Read Only&lt;/strong&gt; role scoped to the desired domain.&lt;/p&gt;</description><pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate><product>AI Crawl Control</product><category>AI Crawl Control</category></item><item><title>Workers - `wrangler types` now generates types for all environments</title><link>https://developers.cloudflare.com/changelog/post/2026-01-13-wrangler-types-multi-environment/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-13-wrangler-types-multi-environment/</guid><description>&lt;p&gt;The &lt;code&gt;wrangler types&lt;/code&gt; command now generates TypeScript types for bindings from &lt;strong&gt;all environments&lt;/strong&gt; defined in your Wrangler configuration file by default.&lt;/p&gt;
&lt;p&gt;Previously, &lt;code&gt;wrangler types&lt;/code&gt; only generated types for bindings in the top-level configuration (or a single environment when using the &lt;code&gt;--env&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;Now, running &lt;code&gt;wrangler types&lt;/code&gt; collects bindings from all environments and includes them in the generated &lt;code&gt;Env&lt;/code&gt; type. This ensures your types are complete regardless of which environment you deploy to.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;generating-types-for-a-specific-environment&quot;&gt;Generating types for a specific environment&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#generating-types-for-a-specific-environment&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If you want the previous behavior of generating types for only a specific environment, you can use the &lt;code&gt;--env&lt;/code&gt; flag:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; types&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --env&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; production&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#types&quot;&gt;generating types for your Worker&lt;/a&gt; in the Wrangler documentation.&lt;/p&gt;</description><pubDate>Tue, 13 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Email security - Enhanced visibility for post-delivery actions</title><link>https://developers.cloudflare.com/changelog/post/2026-01-12-enhanced-visibility-post-delivery-actions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-12-enhanced-visibility-post-delivery-actions/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;Error messages will vary depending on whether you are using Google Workspace or Microsoft 365.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2348,height=1692,format=webp/_astro/enhanced-visibility-post-delivery-actions.BNiyPtJU.png&quot; alt=&quot;failure-log-example&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2348&quot; height=&quot;1692&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;This applies to all Email Security packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise + PhishGuard&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Mon, 12 Jan 2026 11:15:33 GMT</pubDate><product>Email security</product><category>Email security</category></item><item><title>Rules - Metro code field now available in Rules</title><link>https://developers.cloudflare.com/changelog/post/2026-01-12-dma-metro-code-field/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-12-dma-metro-code-field/</guid><description>&lt;p&gt;The &lt;code&gt;ip.src.metro_code&lt;/code&gt; field in the Ruleset Engine is now populated with DMA (Designated Market Area) data.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;field-details&quot;&gt;Field details&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#field-details&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ip.src.metro_code&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String | null&lt;/td&gt;
&lt;td&gt;The metro code (DMA) of the incoming request&apos;s IP address. Returns the designated market area code for the client&apos;s location.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Example filter expression:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;plaintext&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot; data-nb-lang=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;ip.src.metro_code eq &quot;501&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/ip.src.metro_code/&quot;&gt;Fields reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate><product>Rules</product><category>Rules</category></item><item><title>Security Center - Cloudflare Threat Events now support STIX2 format</title><link>https://developers.cloudflare.com/changelog/post/2026-01-12-STIX2-available-for-threat-events-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-12-STIX2-available-for-threat-events-api/</guid><description>&lt;p&gt;We are excited to announce that &lt;strong&gt;Cloudflare Threat Events&lt;/strong&gt; now supports the &lt;strong&gt;STIX2 (Structured Threat Information Expression)&lt;/strong&gt; format. This was a highly requested feature designed to streamline how security teams consume and act upon our threat intelligence.&lt;/p&gt;
&lt;p&gt;By adopting this industry-standard format, you can now integrate Cloudflare&apos;s threat events data more effectively into your existing security ecosystem.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-benefits&quot;&gt;Key benefits&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-benefits&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Eliminate the need for custom parsers, as STIX2 allows for &quot;out of the box&quot; ingestion into major &lt;strong&gt;Threat Intel Platforms (TIPs)&lt;/strong&gt;, &lt;strong&gt;SIEMs&lt;/strong&gt;, and &lt;strong&gt;SOAR&lt;/strong&gt; tools.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;STIX2 provides a standardized way to represent relationships between indicators, sightings, and threat actors, giving your analysts a clearer picture of the threat landscape.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For technical details on how to query events using this format, please refer to our &lt;a href=&quot;https://developers.cloudflare.com/api/resources/cloudforce_one/subresources/threat_events/methods/list/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Threat Events API Documentation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;</description><pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>WAF - WAF Release - 2026-01-12</title><link>https://developers.cloudflare.com/changelog/post/2026-01-12-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-12-waf-release/</guid><description>
&lt;p&gt;This week&apos;s release focuses on improvements to existing detections to enhance coverage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Existing rule enhancements have been deployed to improve detection resilience against SQL Injection.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;72963b917ef74697b5bde02f48a1841a&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...48a1841a&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - AND/OR MAKE_SET/ELT - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule is merged into the original rule &quot;SQLi - AND/OR MAKE_SET/ELT&quot; (ID: &lt;rule-id id=&quot;0f41a593c8fe42c38a26f709252d3934&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...252d3934&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;adf076af09b2484ca9e7881f9e553ad3&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...9e553ad3&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;p&gt;&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;SQLi - Benchmark Function - Beta&lt;/td&gt;
&lt;td&gt;Log&lt;/td&gt;
&lt;td&gt;Block&lt;/td&gt;&lt;br&gt;
&lt;td&gt;This rule is merged into the original rule &quot;SQLi - Benchmark Function&quot; (ID: &lt;rule-id id=&quot;ac4e9ebfb43a4f3998f6072d2ebc44ad&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...2ebc44ad&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/p&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - Validate your generated types with `wrangler types --check`</title><link>https://developers.cloudflare.com/changelog/post/2026-01-11-wrangler-types-check/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-11-wrangler-types-check/</guid><description>&lt;p&gt;Wrangler now supports a &lt;code&gt;--check&lt;/code&gt; flag for the &lt;code&gt;wrangler types&lt;/code&gt; command. This flag validates that your generated types are up to date without writing any changes to disk.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; types&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --check&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;If your types are up to date, the command will succeed silently. If they are out of date, you&apos;ll see an error message indicating which files need to be regenerated.&lt;/p&gt;
&lt;p&gt;For more information, see the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#types&quot;&gt;Wrangler types documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers, Queues - Get notified when your Workers builds succeed or fail</title><link>https://developers.cloudflare.com/changelog/post/2025-12-11-builds-event-subscriptions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-11-builds-event-subscriptions/</guid><description>&lt;p&gt;You can now receive notifications when your Workers&apos; builds start, succeed, fail, or get cancelled using &lt;a href=&quot;https://developers.cloudflare.com/queues/event-subscriptions/&quot;&gt;Event Subscriptions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/&quot;&gt;Workers Builds&lt;/a&gt; publishes events to a &lt;a href=&quot;https://developers.cloudflare.com/queues/&quot;&gt;Queue&lt;/a&gt; that your Worker can read messages from, and then send notifications wherever you need — Slack, Discord, email, or any webhook endpoint.&lt;/p&gt;
&lt;p&gt;You can deploy &lt;a href=&quot;https://github.com/cloudflare/templates/tree/main/workers-builds-notifications-template&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;this Worker&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to your own Cloudflare account to send build notifications to Slack:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://deploy.workers.cloudflare.com/?url=https://github.com/cloudflare/templates/tree/main/workers-builds-notifications-template&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;img src=&quot;https://deploy.workers.cloudflare.com/button&quot; alt=&quot;Deploy to Cloudflare&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The template includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build status with Preview/Live URLs for successful deployments&lt;/li&gt;
&lt;li&gt;Inline error messages for failed builds&lt;/li&gt;
&lt;li&gt;Branch, commit hash, and author name&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1700,height=1088,format=webp/_astro/builds-notifications-slack.rcRiU95L.png&quot; alt=&quot;Slack notifications showing build events&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1700&quot; height=&quot;1088&quot;&gt;
&lt;p&gt;For setup instructions, refer to the &lt;a href=&quot;https://github.com/cloudflare/templates/tree/main/workers-builds-notifications-template#readme&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;template README&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; or the &lt;a href=&quot;https://developers.cloudflare.com/queues/event-subscriptions/manage-event-subscriptions/&quot;&gt;Event Subscriptions documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 09 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Queues</category></item><item><title>Workers - Shell tab completions for Wrangler CLI</title><link>https://developers.cloudflare.com/changelog/post/2026-01-09-wrangler-tab-completion/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-09-wrangler-tab-completion/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Tab completions are supported for Bash, Zsh, Fish, and PowerShell.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;setup&quot;&gt;Setup&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#setup&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Generate the completion script for your shell and add it to your configuration file:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; complete&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; bash&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ~/.bashrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Zsh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; complete&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; zsh&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ~/.zshrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Fish&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; complete&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; fish&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ~/.config/fish/config.fish&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# PowerShell&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; complete&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; powershell&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; $PROFILE&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; d&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;TA&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;          # completes to &apos;deploy&apos;, &apos;dev&apos;, &apos;d1&apos;, etc.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; kv&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;TA&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;        # shows subcommands: namespace, key, bulk&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Tab completions are dynamically generated from Wrangler&apos;s command registry, so they stay up-to-date as new commands and options are added. This feature is powered by &lt;a href=&quot;https://github.com/bombshell-dev/tab/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;@bomb.sh/tab&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#complete&quot;&gt;&lt;code&gt;wrangler complete&lt;/code&gt; documentation&lt;/a&gt; for more details.&lt;/p&gt;</description><pubDate>Fri, 09 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Access - Cloudflare admin activity logs capture creation of DNS over HTTP (DoH) users</title><link>https://developers.cloudflare.com/changelog/post/2026-01-08-Access-audit-log-for-DoH-users/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-08-Access-audit-log-for-DoH-users/</guid><description>&lt;p&gt;Cloudflare &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/logs/&quot;&gt;admin activity logs&lt;/a&gt; now capture each time a &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/resolvers-and-proxies/dns/dns-over-https/&quot;&gt;DNS over HTTP (DoH) user&lt;/a&gt; is created.&lt;/p&gt;
&lt;p&gt;These logs can be viewed from the &lt;a href=&quot;https://one.dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare One dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, pulled via the &lt;a href=&quot;https://developers.cloudflare.com/api/&quot;&gt;Cloudflare API&lt;/a&gt;, and exported through &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/logs/logpush/&quot;&gt;Logpush&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>Workers Analytics Engine, Workers - Workers Analytics Engine SQL now supports filtering using HAVING and LIKE</title><link>https://developers.cloudflare.com/changelog/post/2026-01-07-analytics-engine-support-for-like-and-having/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-07-analytics-engine-support-for-like-and-having/</guid><description>&lt;p&gt;You can now use the &lt;code&gt;HAVING&lt;/code&gt; clause and &lt;code&gt;LIKE&lt;/code&gt; pattern matching operators in &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Workers Analytics Engine&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Workers Analytics Engine allows you to ingest and store high-cardinality data at scale and query your data through a simple SQL API.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;filtering-using-having&quot;&gt;Filtering using &lt;code&gt;HAVING&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#filtering-using-having&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;HAVING&lt;/code&gt; clause complements the &lt;code&gt;WHERE&lt;/code&gt; clause by enabling you to filter groups based on aggregate values. While &lt;code&gt;WHERE&lt;/code&gt; filters rows before aggregation, &lt;code&gt;HAVING&lt;/code&gt; filters groups after aggregation is complete.&lt;/p&gt;
&lt;p&gt;You can use &lt;code&gt;HAVING&lt;/code&gt; to filter groups where the average exceeds a threshold:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    blob1 &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; probe_name,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    avg&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(double1) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; average_temp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; temperature_readings&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; probe_name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;HAVING&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; average_temp &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;You can also filter groups based on aggregates such as the number of items in the group:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    blob1 &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; probe_name,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    count&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; num_readings&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; temperature_readings&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; probe_name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;HAVING&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; num_readings &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 100&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;pattern-matching-using-like&quot;&gt;Pattern matching using &lt;code&gt;LIKE&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#pattern-matching-using-like&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The new pattern matching operators enable you to search for strings that match specific patterns using wildcard characters:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LIKE&lt;/code&gt; - case-sensitive pattern matching&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NOT LIKE&lt;/code&gt; - case-sensitive pattern exclusion&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ILIKE&lt;/code&gt; - case-insensitive pattern matching&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NOT ILIKE&lt;/code&gt; - case-insensitive pattern exclusion&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pattern matching supports two wildcard characters: &lt;code&gt;%&lt;/code&gt; (matches zero or more characters) and &lt;code&gt;_&lt;/code&gt; (matches exactly one character).&lt;/p&gt;
&lt;p&gt;You can match strings starting with a prefix:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; logs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; blob1 &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;LIKE&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;error%&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;You can also match file extensions (case-insensitive):&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; requests&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; blob2 ILIKE &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;%.jpg&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Another example is excluding strings containing specific text:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; *&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; events&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; blob3 &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;NOT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ILIKE &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;%debug%&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ready-to-get-started&quot;&gt;Ready to get started?&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ready-to-get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Learn more about the &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/statements/#having-clause&quot;&gt;&lt;code&gt;HAVING&lt;/code&gt; clause&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/operators/#pattern-matching-operators&quot;&gt;pattern matching operators&lt;/a&gt; in the Workers Analytics Engine SQL reference documentation.&lt;/p&gt;</description><pubDate>Wed, 07 Jan 2026 00:00:00 GMT</pubDate><product>Workers Analytics Engine</product><category>Workers Analytics Engine</category><category>Workers</category></item><item><title>Containers - Custom container instance types now available for all users</title><link>https://developers.cloudflare.com/changelog/post/2026-01-05-custom-instance-types/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-05-custom-instance-types/</guid><description>&lt;p&gt;Custom instance types are now enabled for all &lt;a href=&quot;https://developers.cloudflare.com/containers&quot;&gt;Cloudflare Containers&lt;/a&gt; users. You can now specify specific vCPU, memory, and disk amounts, rather than being limited to pre-defined &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/limits/#instance-types&quot;&gt;instance types&lt;/a&gt;. Previously, only select Enterprise customers were able to customize their instance type.&lt;/p&gt;
&lt;p&gt;To use a custom instance type, specify the &lt;code&gt;instance_type&lt;/code&gt; property as an object with &lt;code&gt;vcpu&lt;/code&gt;, &lt;code&gt;memory_mib&lt;/code&gt;, and &lt;code&gt;disk_mb&lt;/code&gt; fields in your Wrangler configuration:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;containers&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;image = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./Dockerfile&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;instance_type = { vcpu = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, memory_mib = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;6144&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, disk_mb = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;12000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Individual limits for custom instance types are based on the &lt;code&gt;standard-4&lt;/code&gt; 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 &lt;code&gt;lite&lt;/code&gt; or &lt;code&gt;basic&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/limits/#custom-instance-types&quot;&gt;limits documentation&lt;/a&gt; for the full list of constraints on custom instance types.
See the &lt;a href=&quot;https://developers.cloudflare.com/containers/get-started/&quot;&gt;getting started guide&lt;/a&gt; to deploy your first Container,&lt;/p&gt;</description><pubDate>Mon, 05 Jan 2026 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Workers - Build microfrontend applications on Workers</title><link>https://developers.cloudflare.com/changelog/post/2026-01-01-microfrontends/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2026-01-01-microfrontends/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Microfrontends solve several challenges for large-scale applications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Independent deployments&lt;/strong&gt;: Teams deploy updates on their own schedule without redeploying the entire application&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Framework flexibility&lt;/strong&gt;: Build multi-framework applications (for example, Astro, Remix, and Next.js in one app)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gradual migration&lt;/strong&gt;: Migrate from a monolith to a distributed architecture incrementally&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Create a microfrontend project:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages/create?type=vmfe&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;img src=&quot;https://deploy.workers.cloudflare.com/button&quot; alt=&quot;Deploy to Cloudflare&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This template automatically creates a router worker with pre-configured routing logic, and lets you configure &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/&quot;&gt;Service bindings&lt;/a&gt; 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&apos;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.&lt;/p&gt;
&lt;p&gt;Each microfrontend can be a full-framework application, a static site with Workers Static Assets, or any other Worker-based application.&lt;/p&gt;
&lt;p&gt;Get started with the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages/create?type=vmfe&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;microfrontends template&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, or read the &lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/microfrontends/&quot;&gt;microfrontends documentation&lt;/a&gt; for implementation details.&lt;/p&gt;</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare One Appliance, Cloudflare One, Cloudflare WAN - Breakout traffic visibility via NetFlow</title><link>https://developers.cloudflare.com/changelog/post/2025-12-31-connector-breakout-traffic-netflow/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-31-connector-breakout-traffic-netflow/</guid><description>&lt;p&gt;Magic WAN Connector now exports NetFlow data for breakout traffic to Magic Network Monitoring (MNM), providing visibility into traffic that bypasses Cloudflare&apos;s security filtering.&lt;/p&gt;
&lt;p&gt;This feature allows you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Monitor breakout traffic statistics in the Cloudflare dashboard.&lt;/li&gt;
&lt;li&gt;View traffic patterns for applications configured to bypass Cloudflare.&lt;/li&gt;
&lt;li&gt;Maintain visibility across all traffic passing through your Magic WAN Connector.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/analytics/netflow-analytics/&quot;&gt;NetFlow statistics&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate><product>Cloudflare One Appliance</product><category>Cloudflare One Appliance</category><category>Cloudflare One</category><category>Cloudflare WAN</category></item><item><title>Agents, Workers - Agents SDK v0.3.0, workers-ai-provider v3.0.0, and ai-gateway-provider v3.0.0 with AI SDK v6 support</title><link>https://developers.cloudflare.com/changelog/post/2025-12-22-agents-sdk-ai-sdk-v6/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-22-agents-sdk-ai-sdk-v6/</guid><description>&lt;p&gt;We&apos;ve shipped a new release for the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; v0.3.0 bringing full compatibility with &lt;a href=&quot;https://ai-sdk.dev/docs/introduction&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI SDK v6&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and introducing the unified tool pattern, dynamic tool approval, and enhanced React hooks with improved tool handling.&lt;/p&gt;
&lt;p&gt;This release includes improved streaming and tool support, dynamic tool approval (for &quot;human in the loop&quot; systems), enhanced React hooks with &lt;code&gt;onToolCall&lt;/code&gt; callback, improved error handling for streaming responses, and seamless migration from v5 patterns.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Additionally, we&apos;ve updated &lt;strong&gt;workers-ai-provider v3.0.0&lt;/strong&gt;, the official provider for Cloudflare Workers AI models, and &lt;strong&gt;ai-gateway-provider v3.0.0&lt;/strong&gt;, the provider for Cloudflare AI Gateway, to be compatible with AI SDK v6.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;agents-sdk-v030&quot;&gt;Agents SDK v0.3.0&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#agents-sdk-v030&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;unified-tool-pattern&quot;&gt;Unified Tool Pattern&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#unified-tool-pattern&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;AI SDK v6 introduces a unified tool pattern where all tools are defined on the server using the &lt;code&gt;tool()&lt;/code&gt; function. This replaces the previous client-side &lt;code&gt;AITool&lt;/code&gt; pattern.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;server-side-tool-definition&quot;&gt;Server-Side Tool Definition&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#server-side-tool-definition&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { tool } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { z } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;zod&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Server: Define ALL tools on the server&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tools&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Server-executed tool&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	getWeather: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;tool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		description: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Get weather for a city&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		inputSchema: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ city: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		execute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;city&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetchWeather&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(city)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Client-executed tool (no execute = client handles via onToolCall)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	getLocation: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;tool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		description: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Get user location from browser&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		inputSchema: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// No execute function&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Tool requiring approval (dynamic based on input)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	processPayment: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;tool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		description: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Process a payment&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		inputSchema: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ amount: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		needsApproval&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;amount&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 100&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		execute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;amount&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; charge&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(amount)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	})&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;client-side-tool-handling&quot;&gt;Client-Side Tool Handling&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#client-side-tool-handling&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Client: Handle client-side tools via onToolCall callback&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { useAgentChat } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/ai-react&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;messages&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sendMessage&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;addToolOutput&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useAgentChat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onToolCall&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;toolCall&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;addToolOutput&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (toolCall.toolName &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;getLocation&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; position&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				navigator.geolocation.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getCurrentPosition&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(resolve, reject);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			addToolOutput&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				toolCallId: toolCall.toolCallId,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				output: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					lat: position.coords.latitude,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					lng: position.coords.longitude&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;Key benefits of the unified tool pattern:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Server-defined tools&lt;/strong&gt;: All tools are defined in one place on the server&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic approval&lt;/strong&gt;: Use &lt;code&gt;needsApproval&lt;/code&gt; to conditionally require user confirmation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cleaner client code&lt;/strong&gt;: Use &lt;code&gt;onToolCall&lt;/code&gt; callback instead of managing tool configs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Type safety&lt;/strong&gt;: Full TypeScript support with proper tool typing&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;useagentchatoptions&quot;&gt;useAgentChat(options)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#useagentchatoptions&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Creates a new chat interface with enhanced v6 capabilities.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Basic chat setup with onToolCall&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;messages&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sendMessage&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;addToolOutput&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useAgentChat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onToolCall&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;toolCall&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;addToolOutput&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Handle client-side tool execution&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; addToolOutput&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			toolCallId: toolCall.toolCallId,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			output: { result: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;success&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;dynamic-tool-approval&quot;&gt;Dynamic Tool Approval&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#dynamic-tool-approval&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Use &lt;code&gt;needsApproval&lt;/code&gt; on server tools to conditionally require user confirmation:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; paymentTool&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; tool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	description: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Process a payment&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	inputSchema: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		amount: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		recipient: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	needsApproval&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;amount&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; amount &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1000&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	execute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ({ &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;amount&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;recipient&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; processPayment&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(amount, recipient);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;tool-confirmation-detection&quot;&gt;Tool Confirmation Detection&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#tool-confirmation-detection&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;isToolUIPart&lt;/code&gt; and &lt;code&gt;getToolName&lt;/code&gt; functions now check both static and dynamic tool parts:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { isToolUIPart, getToolName } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; pendingToolCallConfirmation&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; messages.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	m.parts?.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;part&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; isToolUIPart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(part) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; part.state &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;input-available&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Handle tool confirmation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (pendingToolCallConfirmation) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; addToolOutput&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		toolCallId: part.toolCallId,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		output: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;User approved the action&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;If you need the v5 behavior (static-only checks), use the new functions:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { isStaticToolUIPart, getStaticToolName } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;converttomodelmessages-is-now-async&quot;&gt;convertToModelMessages() is now async&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#converttomodelmessages-is-now-async&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;convertToModelMessages()&lt;/code&gt; function is now asynchronous. Update all calls to await the result:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { convertToModelMessages } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamText&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	messages: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; convertToModelMessages&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.messages),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;openai&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;gpt-4o&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;modelmessage-type&quot;&gt;ModelMessage type&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#modelmessage-type&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;CoreMessage&lt;/code&gt; type has been removed. Use &lt;code&gt;ModelMessage&lt;/code&gt; instead:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { convertToModelMessages, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ModelMessage } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; modelMessages&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ModelMessage&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[] &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; convertToModelMessages&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(messages);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;generateobject-mode-option-removed&quot;&gt;generateObject mode option removed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#generateobject-mode-option-removed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;mode&lt;/code&gt; option for &lt;code&gt;generateObject&lt;/code&gt; has been removed:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Before (v5)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; generateObject&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	mode: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	schema,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	prompt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// After (v6)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; generateObject&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	schema,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	prompt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;structured-output-with-generatetext&quot;&gt;Structured Output with generateText&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#structured-output-with-generatetext&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;While &lt;code&gt;generateObject&lt;/code&gt; and &lt;code&gt;streamObject&lt;/code&gt; are still functional, the recommended approach is to use &lt;code&gt;generateText&lt;/code&gt;/&lt;code&gt;streamText&lt;/code&gt; with the &lt;code&gt;Output.object()&lt;/code&gt; helper:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { generateText, Output, stepCountIs } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; generateText&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;openai&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;gpt-4&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	output: Output.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		schema: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ name: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() })&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	stopWhen: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;stepCountIs&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	prompt: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Generate a name&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: When using structured output with &lt;code&gt;generateText&lt;/code&gt;, you must configure multiple steps with &lt;code&gt;stopWhen&lt;/code&gt; because generating the structured output is itself a step.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;workers-ai-provider-v300&quot;&gt;workers-ai-provider v3.0.0&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#workers-ai-provider-v300&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Seamless integration with Cloudflare Workers AI models through the updated workers-ai-provider v3.0.0 with AI SDK v6 support.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;model-setup-with-workers-ai&quot;&gt;Model Setup with Workers AI&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#model-setup-with-workers-ai&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Use Cloudflare Workers AI models directly in your agent workflows:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createWorkersAI } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;workers-ai-provider&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { useAgentChat } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/ai-react&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Create Workers AI model (v3.0.0 - enhanced v6 internals)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; model&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createWorkersAI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	binding: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;})(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/meta/llama-3.2-3b-instruct&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;enhanced-file-and-image-support&quot;&gt;Enhanced File and Image Support&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#enhanced-file-and-image-support&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Workers AI models now support v6 file handling with automatic conversion:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Send images and files to Workers AI models&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;sendMessage&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	parts: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{ type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, text: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Analyze this image:&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;file&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			data: imageBuffer,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			mediaType: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;image/jpeg&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Workers AI provider automatically converts to proper format&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;streaming-with-workers-ai&quot;&gt;Streaming with Workers AI&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#streaming-with-workers-ai&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Enhanced streaming support with automatic warning detection:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Streaming with Workers AI models&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamText&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;createWorkersAI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ binding: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; })(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/meta/llama-3.2-3b-instruct&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	messages: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; convertToModelMessages&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(messages),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onChunk&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Enhanced streaming with warning handling&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(chunk);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ai-gateway-provider-v300&quot;&gt;ai-gateway-provider v3.0.0&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ai-gateway-provider-v300&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ai-gateway-setup&quot;&gt;AI Gateway Setup&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ai-gateway-setup&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Use Cloudflare AI Gateway to add analytics, caching, and rate limiting to your AI applications:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createAIGateway } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai-gateway-provider&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Create AI Gateway provider (v3.0.0 - enhanced v6 internals)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; model&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createAIGateway&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	gatewayUrl: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://gateway.ai.cloudflare.com/v1/your-account-id/gateway&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	headers: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;		&quot;Authorization&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Bearer ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI_GATEWAY_TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;})({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	provider: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;openai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;gpt-4o&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;migration-from-v5&quot;&gt;Migration from v5&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#migration-from-v5&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;deprecated-apis&quot;&gt;Deprecated APIs&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#deprecated-apis&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The following APIs are deprecated in favor of the unified tool pattern:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Deprecated&lt;/th&gt;
&lt;th&gt;Replacement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;AITool&lt;/code&gt; type&lt;/td&gt;
&lt;td&gt;Use AI SDK&apos;s &lt;code&gt;tool()&lt;/code&gt; function on server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;extractClientToolSchemas()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Define tools on server, no client schemas needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;createToolsFromClientSchemas()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Define tools on server with &lt;code&gt;tool()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;toolsRequiringConfirmation&lt;/code&gt; option&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;needsApproval&lt;/code&gt; on server tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;experimental_automaticToolResolution&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;onToolCall&lt;/code&gt; callback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tools&lt;/code&gt; option in &lt;code&gt;useAgentChat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;onToolCall&lt;/code&gt; for client-side execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;addToolResult()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;addToolOutput()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;breaking-changes-summary&quot;&gt;Breaking Changes Summary&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#breaking-changes-summary&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Unified Tool Pattern&lt;/strong&gt;: All tools must be defined on the server using &lt;code&gt;tool()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;convertToModelMessages()&lt;/code&gt; is async&lt;/strong&gt;: Add &lt;code&gt;await&lt;/code&gt; to all calls&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;CoreMessage&lt;/code&gt; removed&lt;/strong&gt;: Use &lt;code&gt;ModelMessage&lt;/code&gt; instead&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;generateObject&lt;/code&gt; mode removed&lt;/strong&gt;: Remove &lt;code&gt;mode&lt;/code&gt; option&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;isToolUIPart&lt;/code&gt; behavior changed&lt;/strong&gt;: Now checks both static and dynamic tool parts&lt;/li&gt;
&lt;/ol&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;installation&quot;&gt;Installation&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#installation&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Update your dependencies to use the latest versions:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; agents@^0.3.0&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; workers-ai-provider@^3.0.0&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ai-gateway-provider@^3.0.0&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ai@^6.0.0&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @ai-sdk/react@^3.0.0&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; @ai-sdk/openai@^3.0.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;resources&quot;&gt;Resources&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/agents/blob/main/docs/migration-to-ai-sdk-v6.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Migration Guide&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; - Comprehensive migration documentation from v5 to v6&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ai-sdk.dev/docs/migration-guides/migration-guide-6-0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI SDK v6 Documentation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; - Official AI SDK migration guide&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vercel.com/blog/ai-sdk-6&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI SDK v6 Announcement&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; - Learn about new features in v6&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sdk.vercel.ai/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI SDK Documentation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; - Complete AI SDK reference&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/agents/issues&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GitHub Issues&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; - Report bugs or request features&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;feedback-welcome&quot;&gt;Feedback Welcome&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#feedback-welcome&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;We&apos;d love your feedback! We&apos;re particularly interested in feedback on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Migration experience&lt;/strong&gt; - How smooth was the upgrade from v5 to v6?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unified tool pattern&lt;/strong&gt; - How does the new server-defined tool pattern work for you?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic tool approval&lt;/strong&gt; - Does the &lt;code&gt;needsApproval&lt;/code&gt; feature meet your needs?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Gateway integration&lt;/strong&gt; - How well does the new provider work with your setup?&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Mon, 22 Dec 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Cloudflare Fundamentals, Terraform - Terraform v5.15.0 now available</title><link>https://developers.cloudflare.com/changelog/post/2025-12-19-terraform-v5.15.0-provider/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-19-terraform-v5.15.0-provider/</guid><description>&lt;p&gt;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 &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/5774&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2-3 week cadence&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to ensure its stability and reliability, including the v5.15 release. We have also pivoted from an &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;issue-to-issue approach to a resource-per-resource approach&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; - 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.&lt;/p&gt;
&lt;p&gt;Thank you for continuing to raise issues. They make our provider stronger and help us build products that reflect your needs.&lt;/p&gt;
&lt;p&gt;This release includes bug fixes, the stabilization of even more popular resources, and more.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;features&quot;&gt;Features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ai_search:&lt;/strong&gt; Add AI Search endpoints (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/6f02adb420e872457f71f95b49cb527663388915&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;6f02adb&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;certificate_pack:&lt;/strong&gt; Ensure proper Terraform resource ID handling for path parameters in API calls (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/081f32acab4ce9a194a7ff51c8e9fcabd349895a&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;081f32a&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;worker_version:&lt;/strong&gt; Support &lt;code&gt;startup_time_ms&lt;/code&gt; (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/286ab55bea8d5be0faa5a2b5b8b157e4a2214eba&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;286ab55&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_dlp_custom_entry:&lt;/strong&gt; Support &lt;code&gt;upload_status&lt;/code&gt; (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/7dc0fe3b23726ead8dc075f86728a0540846d90c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;7dc0fe3&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_dlp_entry:&lt;/strong&gt; Support &lt;code&gt;upload_status&lt;/code&gt; (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/7dc0fe3b23726ead8dc075f86728a0540846d90c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;7dc0fe3&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_dlp_integration_entry:&lt;/strong&gt; Support &lt;code&gt;upload_status&lt;/code&gt; (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/7dc0fe3b23726ead8dc075f86728a0540846d90c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;7dc0fe3&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_dlp_predefined_entry:&lt;/strong&gt; Support &lt;code&gt;upload_status&lt;/code&gt; (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/7dc0fe3b23726ead8dc075f86728a0540846d90c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;7dc0fe3&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_gateway_policy:&lt;/strong&gt; Support &lt;code&gt;forensic_copy&lt;/code&gt; (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/5741fd0ed9f7270d20731cc47ec45eb0403a628b&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;5741fd0&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_list:&lt;/strong&gt; Support additional types (category, location, device) (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/5741fd0ed9f7270d20731cc47ec45eb0403a628b&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;5741fd0&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;bug-fixes&quot;&gt;Bug fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bug-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;access_rules:&lt;/strong&gt; Add validation to prevent state drift. Ideally, we&apos;d use Semantic Equality but since that isn&apos;t an option, this will remove a foot-gun. (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/44577911b3cbe45de6279aefa657bdee73c0794d&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;4457791&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_pages_project:&lt;/strong&gt; Addressing drift issues (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/6edffcfcf187fdc9b10b624b9a9b90aed2fb2b2e&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;6edffcf&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;) (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/3db318e747423bf10ce587d9149e90edcd8a77b0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;3db318e&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_worker:&lt;/strong&gt; Can be cleanly imported (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/4859b52968bb25570b680df9813f8e07fd50728f&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;4859b52&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_worker:&lt;/strong&gt; Ensure clean imports (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/5b525bc478a4e2c9c0d4fd659b92cc7f7c18016a&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;5b525bc&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;list_items:&lt;/strong&gt; Add validation for IP List items to avoid inconsistent state (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/b6733dc4be909a5ab35895a88e519fc2582ccada&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;b6733dc&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_access_application:&lt;/strong&gt; Remove all conditions from sweeper (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/3197f1aed61be326d507d9e9e3b795b9f1d18fd7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;3197f1a&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;spectrum_application:&lt;/strong&gt; Map missing fields during spectrum resource import (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6495&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6495&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;) (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/commit/ddb4e722b82c735825a549d651a9da219c142efa&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ddb4e72&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade-to-newer-version&quot;&gt;Upgrade to newer version&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade-to-newer-version&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;stabilized&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. We will be releasing a new migration tool in March 2026 to help support v4 to v5 transitions for our most popular resources.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;for-more-information&quot;&gt;For more information&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#for-more-information&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Terraform Provider&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/terraform/&quot;&gt;Documentation on using Terraform with Cloudflare&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 19 Dec 2025 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>Terraform</category></item><item><title>Workers - Static prerendering support for TanStack Start</title><link>https://developers.cloudflare.com/changelog/post/2025-12-19-tanstack-start-prerendering/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-19-tanstack-start-prerendering/</guid><description>&lt;p&gt;&lt;a href=&quot;https://tanstack.com/start/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TanStack Start&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; apps can now prerender routes to static HTML at build time with access to build time environment variables
and bindings,  and serve them as &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/&quot;&gt;static assets&lt;/a&gt;. To enable prerendering, configure the &lt;code&gt;prerender&lt;/code&gt; option of the TanStack Start plugin in your Vite config:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;vite.config.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { defineConfig } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;vite&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { cloudflare } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/vite-plugin&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { tanstackStart } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@tanstack/react-start/plugin/vite&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineConfig&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  plugins: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;    cloudflare&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ viteEnvironment: { name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ssr&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;    tanstackStart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      prerender: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        enabled: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;This feature requires &lt;code&gt;@tanstack/react-start&lt;/code&gt; v1.138.0 or later. See the &lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/tanstack-start/#static-prerendering&quot;&gt;TanStack Start framework guide&lt;/a&gt; for more details.&lt;/p&gt;</description><pubDate>Fri, 19 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Crawl Control - New AI Crawl Control Overview tab</title><link>https://developers.cloudflare.com/changelog/post/2025-12-18-overview-tab/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-18-overview-tab/</guid><description>&lt;p&gt;The &lt;strong&gt;Overview&lt;/strong&gt; tab is now the default view in AI Crawl Control. The previous default view with controls for individual AI crawlers is available in the &lt;strong&gt;Crawlers&lt;/strong&gt; tab.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Executive summary&lt;/strong&gt; — Monitor total requests, volume change, most common status code, most popular path, and high-volume activity&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operator grouping&lt;/strong&gt; — Track crawlers by their operating companies (OpenAI, Microsoft, Google, ByteDance, Anthropic, Meta)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Customizable filters&lt;/strong&gt; — Filter your snapshot by date range, crawler, operator, hostname, or path&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1113,height=839,format=webp/_astro/ai-crawl-control-overview-tab.Duwqq4bm.png&quot; alt=&quot;AI Crawl Control Overview tab showing executive summary, metrics, and crawler groups&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1113&quot; height=&quot;839&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Log in to the Cloudflare dashboard and select your account and domain.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;AI Crawl Control&lt;/strong&gt;, where the &lt;strong&gt;Overview&lt;/strong&gt; tab opens by default with your activity snapshot.&lt;/li&gt;
&lt;li&gt;Use filters to customize your view by date range, crawler, operator, hostname, or path.&lt;/li&gt;
&lt;li&gt;Navigate to the &lt;strong&gt;Crawlers&lt;/strong&gt; tab to manage controls for individual crawlers.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/features/analyze-ai-traffic/&quot;&gt;analyzing AI traffic&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/features/manage-ai-crawlers/&quot;&gt;managing AI crawlers&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><product>AI Crawl Control</product><category>AI Crawl Control</category></item><item><title>Analytics - Improved accuracy of cached request classification in analytics</title><link>https://developers.cloudflare.com/changelog/post/2025-12-18-cached-request-classification/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-18-cached-request-classification/</guid><description>&lt;p&gt;The cached/uncached classification logic used in Zone Overview analytics has been updated to improve accuracy.&lt;/p&gt;
&lt;p&gt;Previously, requests were classified as &quot;cached&quot; 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.&lt;/p&gt;
&lt;p&gt;The condition has been removed from the Zone Overview page. Cached/uncached classification now aligns with the heuristics used in &lt;a href=&quot;https://developers.cloudflare.com/analytics/account-and-zone-analytics/zone-analytics/&quot;&gt;HTTP Analytics&lt;/a&gt;, so only requests genuinely served from cache are counted as cached.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What changed:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zone Overview&lt;/strong&gt; — Cache ratios now reflect actual cache performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP Analytics&lt;/strong&gt; — No change. HTTP Analytics already used the correct classification logic.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Historical data&lt;/strong&gt; — This fix applies to new requests only. Previously logged data is not retroactively updated.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><product>Analytics</product><category>Analytics</category></item><item><title>R2, R2 Data Catalog - R2 Data Catalog now supports automatic snapshot expiration</title><link>https://developers.cloudflare.com/changelog/post/2025-12-18-r2-data-catalog-snapshot-expiration/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-18-r2-data-catalog-snapshot-expiration/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; now supports automatic snapshot expiration for Apache Iceberg tables.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Without regular cleanup, these accumulated snapshots can lead to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Metadata overhead&lt;/li&gt;
&lt;li&gt;Slower table operations&lt;/li&gt;
&lt;li&gt;Increased storage costs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Snapshot expiration in R2 Data Catalog automatically removes old table snapshots based on your configured retention policy, improving performance and storage costs.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Enable catalog-level snapshot expiration&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Expire snapshots older than 7 days, always retain at least 10 recent snapshots&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; bucket&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; catalog&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; snapshot-expiration&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; enable&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-bucket&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --older-than-days&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 7&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --retain-last&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Snapshot expiration uses two parameters to determine which snapshots to remove:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--older-than-days&lt;/code&gt;: age threshold in days&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--retain-last&lt;/code&gt;: minimum snapshot count to retain&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both conditions must be met before a snapshot is expired, ensuring you always retain recent snapshots even if they exceed the age threshold.&lt;/p&gt;
&lt;p&gt;This feature complements &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/table-maintenance/&quot;&gt;automatic compaction&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/table-maintenance/&quot;&gt;Table maintenance&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/manage-catalogs/&quot;&gt;Manage catalogs&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><product>R2</product><category>R2</category><category>R2 Data Catalog</category></item><item><title>WAF - WAF Release - 2025-12-18</title><link>https://developers.cloudflare.com/changelog/post/2025-12-18-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-18-waf-release/</guid><description>
&lt;p&gt;This week&apos;s release focuses on improvements to existing detections to enhance coverage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Existing rule enhancements have been deployed to improve detection resilience against broad classes of web attacks and strengthen behavioral coverage.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;6429f7386b1546cf9dfce631be5ec20c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...be5ec20c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Atlassian Confluence - Code Injection - CVE:CVE-2021-26084 - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule is merged into the original rule &quot;Atlassian Confluence - Code Injection - CVE:CVE-2021-26084&quot; (ID: &lt;rule-id id=&quot;e8c550810618437c953cf3a969e0b97a&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...69e0b97a&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;9108ddb347b3497e9f9351640d9206e3&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...0d9206e3&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;p&gt;&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;PostgreSQL - SQLi - Copy - Beta&lt;/td&gt;
&lt;td&gt;Log&lt;/td&gt;
&lt;td&gt;Block&lt;/td&gt;&lt;br&gt;
&lt;td&gt;This rule is merged into the original rule &quot;PostgreSQL - SQLi - COPY&quot; (ID: &lt;rule-id id=&quot;705a6b5569d5472596910e3ce7265a4e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...e7265a4e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/p&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;cb687d73cc954092b58b90b00cd00ba7&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...0cd00ba7&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;p&gt;&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Generic Rules - Command Execution - Body&lt;/td&gt;
&lt;td&gt;Log&lt;/td&gt;
&lt;td&gt;Disabled&lt;/td&gt;&lt;br&gt;
&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/p&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;bf30657ffa2a424cbf6570dbcd679ad4&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...cd679ad4&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Command Execution - Header&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;6df040f716194070a242967cfd181fb3&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...fd181fb3&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Command Execution - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;39a4fdc37be948709fa7492e7a95bc3a&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...7a95bc3a&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Tautology - URI - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule is merged into the original rule &quot;SQLi - Tautology - URI&quot; (ID: &lt;rule-id id=&quot;4c580ea1b5174183b7f5e940b3de2e0a&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...b3de2e0a&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;810e0ffe1dd84e67b159129b432ac90d&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...432ac90d&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - WaitFor Function - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule is merged into the original rule &quot;SQLi - WaitFor Function&quot; (ID: &lt;rule-id id=&quot;b16fe708799441dea3049a99d5faba59&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d5faba59&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;80690005fef342e0ad6bc9af596c741e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...596c741e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - AND/OR Digit Operator Digit 2 - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule is merged into the original rule &quot;SQLi - AND/OR Digit Operator Digit&quot; (ID: &lt;rule-id id=&quot;98e7e08ae64247e2801ca4b388d80772&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...88d80772&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;eaf11ab80b0d491cbb7186f303b2f3fe&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...03b2f3fe&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SQLi - Equation 2 - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule is merged into the original rule &quot;SQLi - Equation&quot; (ID: &lt;rule-id id=&quot;133c6f83cdf14509a4ca6b82a72a6b3a&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...a72a6b3a&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers for Platforms - Workers for Platforms - Dashboard Improvements</title><link>https://developers.cloudflare.com/changelog/post/2025-12-18-dashboard-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-18-dashboard-improvements/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/&quot;&gt;Workers for Platforms&lt;/a&gt; lets you build multi-tenant platforms on &lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Cloudflare Workers&lt;/a&gt;, allowing your end users to deploy and run their own code on your platform. It&apos;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2226,height=1364,format=webp/_astro/dashboard-improvements.ChVWUo88.png&quot; alt=&quot;Workers for Platforms Dashboard Improvements&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2226&quot; height=&quot;1364&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-improvements&quot;&gt;Key improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Namespace Management:&lt;/strong&gt; You can now create and configure &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/how-workers-for-platforms-works/#dispatch-namespace&quot;&gt;dispatch namespaces&lt;/a&gt; directly within the dashboard to start a new platform setup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dispatch Worker Templates:&lt;/strong&gt; New Dispatch Worker templates allow you to quickly define how traffic is routed to individual Workers within your namespace. Refer to the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/configuration/dynamic-dispatch/&quot;&gt;Dynamic Dispatch documentation&lt;/a&gt; for more examples.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tag Management:&lt;/strong&gt; You can now set and update &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/configuration/tags/&quot;&gt;tags&lt;/a&gt; on User Workers, making it easier to group and manage your Workers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Binding Visibility:&lt;/strong&gt; &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-for-platforms/workers-for-platforms/configuration/bindings/&quot;&gt;Bindings&lt;/a&gt; attached to User Workers are now visible directly within the User Worker view.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploy Vibe Coding Platform in one-click:&lt;/strong&gt; Deploy a &lt;a href=&quot;https://developers.cloudflare.com/reference-architecture/diagrams/ai/ai-vibe-coding-platform/&quot;&gt;reference implementation&lt;/a&gt; of an AI vibe coding platform directly from the dashboard. Powered by the Cloudflare&apos;s &lt;a href=&quot;https://github.com/cloudflare/vibesdk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;VibeSDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, this starter kit integrates with Workers for Platforms to handle the deployment of AI-generated projects at scale.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, go to &lt;strong&gt;Workers for Platforms&lt;/strong&gt; under &lt;strong&gt;Compute &amp;amp; AI&lt;/strong&gt; in the &lt;a href=&quot;https://dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><product>Workers for Platforms</product><category>Workers for Platforms</category></item><item><title>Workers - Build image policies for Workers Builds and Cloudflare Pages</title><link>https://developers.cloudflare.com/changelog/post/2025-12-01-build-image-policies-dev-plat/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-01-build-image-policies-dev-plat/</guid><description>&lt;p&gt;We&apos;ve published build image policies for &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/build-image/#build-image-policy&quot;&gt;Workers Builds&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/pages/configuration/build-image/#build-image-policy&quot;&gt;Cloudflare Pages&lt;/a&gt;, which establish:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Minor version updates&lt;/strong&gt;: We typically update preinstalled software to the latest available minor version without notice. For tools that don&apos;t follow semantic versioning (e.g., Bun or Hugo), we provide 3 months’ notice.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Major version updates&lt;/strong&gt;: Before preinstalled software reaches end-of-life, we update to the next stable LTS version with 3 months’ notice.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Build image version deprecation (Pages only)&lt;/strong&gt;: We provide 6 months’ notice before deprecation. Projects on v1 or v2 will be automatically moved to v3 on their specified deprecation dates.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To prepare for updates, monitor the &lt;a href=&quot;https://developers.cloudflare.com/changelog/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Changelog&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, dashboard notifications, and email. You can also &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/build-image/#overriding-default-versions&quot;&gt;override default versions&lt;/a&gt; to maintain specific versions.&lt;/p&gt;</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Retrieve your authentication token with `wrangler auth token`</title><link>https://developers.cloudflare.com/changelog/post/2025-12-18-wrangler-auth-token/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-18-wrangler-auth-token/</guid><description>&lt;p&gt;Wrangler now includes a new &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#auth-token&quot;&gt;&lt;code&gt;wrangler auth token&lt;/code&gt;&lt;/a&gt; command that retrieves your current authentication token or credentials for use with other tools and scripts.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; auth&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; token&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;The command returns whichever authentication method is currently configured, in priority order: API token from &lt;code&gt;CLOUDFLARE_API_TOKEN&lt;/code&gt;, or OAuth token from &lt;code&gt;wrangler login&lt;/code&gt; (automatically refreshed if expired).&lt;/p&gt;
&lt;p&gt;Use the &lt;code&gt;--json&lt;/code&gt; flag to get structured output including the token type:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; auth&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; token&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;The JSON output includes the authentication type:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// API token&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{ &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;api_token&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;token&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// OAuth token&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{ &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;oauth&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;token&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// API key/email (only available with --json)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{ &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;api_key&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;key&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;email&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;API key/email credentials from &lt;code&gt;CLOUDFLARE_API_KEY&lt;/code&gt; and &lt;code&gt;CLOUDFLARE_EMAIL&lt;/code&gt; require the &lt;code&gt;--json&lt;/code&gt; flag since this method uses two values instead of a single token.&lt;/p&gt;</description><pubDate>Thu, 18 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Gateway, Cloudflare One - Shadow IT - domain level SaaS analytics</title><link>https://developers.cloudflare.com/changelog/post/2025-12-17-shadow-it-domain-analytics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-17-shadow-it-domain-analytics/</guid><description>&lt;p&gt;Zero Trust has again upgraded its &lt;strong&gt;Shadow IT analytics&lt;/strong&gt;, 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=452,format=webp/_astro/shadow-it-domain.DoZnGAtf.png&quot; alt=&quot;New Domain Level Metrics&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1800&quot; height=&quot;452&quot;&gt;
&lt;p&gt;These metrics can be filtered by all available filters on the dashboard, including user, application, or content category.&lt;/p&gt;
&lt;p&gt;Both the analytics and policies are accessible in the Cloudflare &lt;a href=&quot;https://one.dash.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Zero Trust dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, empowering organizations with better visibility and control.&lt;/p&gt;</description><pubDate>Wed, 17 Dec 2025 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category><category>Cloudflare One</category></item><item><title>Cloudflare One - New duplicate action for supported Cloudflare One resources</title><link>https://developers.cloudflare.com/changelog/post/2025-12-16-new-duplicate-action-for-supported-cloudflare-one-resources/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-16-new-duplicate-action-for-supported-cloudflare-one-resources/</guid><description>&lt;p&gt;You can now duplicate specific Cloudflare One resources with a single click from the dashboard.&lt;/p&gt;
&lt;p&gt;Initially supported resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Access Applications&lt;/li&gt;
&lt;li&gt;Access Policies&lt;/li&gt;
&lt;li&gt;Gateway Policies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To try this out, simply click on the overflow menu (⋮) from the resource table and click &lt;i&gt;Duplicate&lt;/i&gt;. We will continue to add the Duplicate action for resources throughout 2026.&lt;/p&gt;</description><pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category></item><item><title>Workers - Support for ctx.exports in @cloudflare/vitest-pool-workers</title><link>https://developers.cloudflare.com/changelog/post/2025-12-16-vitest-ctx-exports-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-16-vitest-ctx-exports-support/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/testing/vitest-integration/&quot;&gt;&lt;code&gt;@cloudflare/vitest-pool-workers&lt;/code&gt;&lt;/a&gt; package now supports the &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/context/#exports&quot;&gt;&lt;code&gt;ctx.exports&lt;/code&gt; API&lt;/a&gt;, allowing you to access your Worker&apos;s top-level exports during tests.&lt;/p&gt;
&lt;p&gt;You can access &lt;code&gt;ctx.exports&lt;/code&gt; in unit tests by calling &lt;code&gt;createExecutionContext()&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createExecutionContext } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:test&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { it, expect } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;vitest&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;can access ctx.exports&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createExecutionContext&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ctx.exports.MyEntryPoint.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;myMethod&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;  expect&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(result).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;expected value&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Alternatively, you can import &lt;code&gt;exports&lt;/code&gt; directly from &lt;code&gt;cloudflare:workers&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { exports } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { it, expect } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;vitest&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;can access imported exports&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; exports&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.MyEntryPoint.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;myMethod&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;  expect&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(result).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;expected value&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;See the &lt;a href=&quot;https://github.com/cloudflare/workers-sdk/tree/main/fixtures/vitest-pool-workers-examples/context-exports&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;context-exports fixture&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; for a complete example.&lt;/p&gt;</description><pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Configure your framework for Cloudflare automatically</title><link>https://developers.cloudflare.com/changelog/post/2025-12-16-wrangler-autoconfig/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-16-wrangler-autoconfig/</guid><description>&lt;p&gt;Wrangler now supports automatic configuration for popular web frameworks in experimental mode, making it even easier to deploy to Cloudflare Workers.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Now &lt;code&gt;wrangler deploy&lt;/code&gt; does this for you. Starting with Wrangler 4.55, you can use &lt;code&gt;npx wrangler deploy --x-autoconfig&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;You can also configure your application without deploying it by using the new &lt;code&gt;npx wrangler setup&lt;/code&gt; command. This enables you to easily review what changes we are making so your application is ready for Cloudflare Workers.&lt;/p&gt;
&lt;p&gt;The following application frameworks are supported starting today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Next.js&lt;/li&gt;
&lt;li&gt;Astro&lt;/li&gt;
&lt;li&gt;Nuxt&lt;/li&gt;
&lt;li&gt;TanStack Start&lt;/li&gt;
&lt;li&gt;SolidStart&lt;/li&gt;
&lt;li&gt;React Router&lt;/li&gt;
&lt;li&gt;SvelteKit&lt;/li&gt;
&lt;li&gt;Docusaurus&lt;/li&gt;
&lt;li&gt;Qwik&lt;/li&gt;
&lt;li&gt;Analog&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;code&gt;npx wrangler deploy --x-autoconfig&lt;/code&gt; to upload to Cloudflare.&lt;/p&gt;
&lt;p&gt;We&apos;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 &lt;a href=&quot;https://github.com/cloudflare/workers-sdk/discussions/11667&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GitHub discussion&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and would love to hear your feedback.&lt;/p&gt;</description><pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Durable Objects, Workers - New Best Practices guide for Durable Objects</title><link>https://developers.cloudflare.com/changelog/post/2025-12-15-rules-of-durable-objects/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-15-rules-of-durable-objects/</guid><description>
&lt;p&gt;A new &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/best-practices/rules-of-durable-objects/&quot;&gt;Rules of Durable Objects&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;Key guidance includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Design around your &quot;atom&quot; of coordination&lt;/strong&gt; — Create one Durable Object per logical unit (chat room, game session, user) instead of a global singleton that becomes a bottleneck.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use SQLite storage with RPC methods&lt;/strong&gt; — SQLite-backed Durable Objects with typed RPC methods provide the best developer experience and performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Understand input and output gates&lt;/strong&gt; — Learn how Cloudflare&apos;s runtime prevents data races by default, how write coalescing works, and when to use &lt;code&gt;blockConcurrencyWhile()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Leverage Hibernatable WebSockets&lt;/strong&gt; — Reduce costs for real-time applications by allowing Durable Objects to sleep while maintaining WebSocket connections.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/examples/testing-with-durable-objects/&quot;&gt;testing documentation&lt;/a&gt; has also been updated with modern patterns using &lt;code&gt;@cloudflare/vitest-pool-workers&lt;/code&gt;, including examples for testing SQLite storage, alarms, and direct instance access:&lt;/p&gt;
&lt;div&gt;&lt;div data-nb-tabs data-nb-sync-key=&quot;workersExamples&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;JavaScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;test/counter.test.js&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { env, runDurableObjectAlarm } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:test&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { it, expect } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;vitest&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;can test Durable Objects with isolated storage&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stub&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNTER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getByName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Call RPC methods directly on the stub&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stub.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	expect&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stub.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getCount&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;()).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Trigger alarms immediately without waiting&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; runDurableObjectAlarm&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(stub);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;TypeScript&quot; class&gt;&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;test/counter.test.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { env, runDurableObjectAlarm } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:test&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { it, expect } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;vitest&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;it&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;can test Durable Objects with isolated storage&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stub&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNTER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getByName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;test&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Call RPC methods directly on the stub&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stub.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;increment&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	expect&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stub.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getCount&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;()).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toBe&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Trigger alarms immediately without waiting&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; runDurableObjectAlarm&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(stub);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/div&gt;</description><pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Durable Objects, Workers - Billing for SQLite Storage</title><link>https://developers.cloudflare.com/changelog/post/2025-12-12-durable-objects-sqlite-storage-billing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-12-durable-objects-sqlite-storage-billing/</guid><description>
&lt;p&gt;Storage billing for SQLite-backed Durable Objects will be enabled in January 2026, with a target date of January 7, 2026 (no earlier).&lt;/p&gt;
&lt;p&gt;To view your SQLite storage usage, go to the &lt;strong&gt;Durable Objects&lt;/strong&gt; page&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/durable-objects&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Durable Objects&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Developers on the Workers Paid plan with Durable Object&apos;s SQLite storage usage beyond included limits will incur charges according to &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/platform/pricing/#sqlite-storage-backend&quot;&gt;SQLite storage pricing&lt;/a&gt; announced in September 2024 with the &lt;a href=&quot;https://blog.cloudflare.com/sqlite-in-durable-objects/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;public beta&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. Developers on the Workers Free plan will not be charged.&lt;/p&gt;
&lt;p&gt;Compute billing for SQLite-backed Durable Objects has been enabled since the initial public beta. SQLite-backed Durable Objects currently incur &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/platform/pricing/#compute-billing&quot;&gt;charges for requests and duration&lt;/a&gt;, and no changes are being made to compute billing.&lt;/p&gt;
&lt;p&gt;For more information about SQLite storage pricing and limits, refer to the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/platform/pricing/#sqlite-storage-backend&quot;&gt;Durable Objects pricing documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 12 Dec 2025 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>R2 SQL - R2 SQL now supports aggregations and schema discovery</title><link>https://developers.cloudflare.com/changelog/post/2025-12-12-aggregation-support-and-more/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-12-aggregation-support-and-more/</guid><description>&lt;p&gt;R2 SQL now supports aggregation functions, &lt;code&gt;GROUP BY&lt;/code&gt;, &lt;code&gt;HAVING&lt;/code&gt;, along with schema discovery commands to make it easy to explore your data catalog.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;aggregation-functions&quot;&gt;Aggregation Functions&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#aggregation-functions&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can now perform aggregations on Apache Iceberg tables in &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; using standard SQL functions including &lt;code&gt;COUNT(*)&lt;/code&gt;, &lt;code&gt;SUM()&lt;/code&gt;, &lt;code&gt;AVG()&lt;/code&gt;, &lt;code&gt;MIN()&lt;/code&gt;, and &lt;code&gt;MAX()&lt;/code&gt;. Combine these with &lt;code&gt;GROUP BY&lt;/code&gt; to analyze data across dimensions, and use &lt;code&gt;HAVING&lt;/code&gt; to filter aggregated results.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Calculate average transaction amounts by department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; department, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;), &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AVG&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; region &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;North&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;HAVING&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; COUNT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 50&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;ORDER BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; AVG&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;DESC&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;-- Find high-value departments&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; department, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;SUM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; my_namespace&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sales_data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;GROUP BY&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; department&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;HAVING&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; SUM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(total_amount) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 50000&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;schema-discovery&quot;&gt;Schema Discovery&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#schema-discovery&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;New metadata commands make it easy to explore your data catalog and understand table structures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;SHOW DATABASES&lt;/code&gt; or &lt;code&gt;SHOW NAMESPACES&lt;/code&gt; - List all available namespaces&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SHOW TABLES IN namespace_name&lt;/code&gt; - List tables within a namespace&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DESCRIBE namespace_name.table_name&lt;/code&gt; - View table schema and column types&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sql&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; query&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;{ACCOUNT_ID}_{BUCKET_NAME}&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;DESCRIBE default.sales_data;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ⛅️&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 4.54.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;─────────────────────────────────────────────&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;┌──────────────────┬────────────────┬──────────┬─────────────────┬───────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; column_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;           │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; required&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; initial_default&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; write_default&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; doc&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                                                                               │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;          │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; BIGINT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Unique&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; identifier&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; for&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; each&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sales&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; transaction&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                                      │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale_timestamp&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; TIMESTAMPTZ&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Exact&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; date&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; and&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; time&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; when&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; occurred&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (used &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; partitioning&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; department&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; TEXT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;           │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Product&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; department&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (8 &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;categories:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Electronics,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Beauty,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Home,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Toys,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Sports,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Food,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Clothing,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Books&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; category&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; TEXT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;           │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Product&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; category&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; grouping&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (4 &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;categories:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Premium,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Standard,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Budget,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Clearance&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; region&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;           │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; TEXT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;           │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Geographic&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sales&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; region&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (5 &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;regions:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; North,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; South,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; East,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; West,&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Central&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                            │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; product_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; INT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;            │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Unique&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; identifier&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; for&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; product&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sold&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                                            │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; quantity&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;         │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; INT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;            │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Number&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; of&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; units&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sold&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; transaction&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (range: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;1-50&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                                            │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; unit_price&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; DECIMAL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;10,&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Price&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; per&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; unit&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; dollars&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (range: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;$5&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.00-&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$500&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.00&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                                                  │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; total_amount&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;     │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; DECIMAL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;10,&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Total&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; amount&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; before&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; tax&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (quantity &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;×&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; unit_price&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; with&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; discounts&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; applied&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                       │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; discount_percent&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; INT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;            │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Discount&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; percentage&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; applied&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; to&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (0-50%)                                                  │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; tax_amount&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;       │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; DECIMAL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;10,&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Tax&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; amount&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; collected&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; on&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                                                 │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; profit_margin&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; DECIMAL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;10,&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Profit&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; margin&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; on&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; as&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; decimal&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; percentage&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                                │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; customer_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; INT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;            │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Unique&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; identifier&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; for&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; customer&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; who&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; made&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; purchase&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                                          │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; is_online_sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;   │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; BOOLEAN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Boolean&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; flag&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; indicating&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; if&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; was&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; made&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; online&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (true) or in-store (&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                        │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;├──────────────────┼────────────────┼──────────┼─────────────────┼───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────┤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;│&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale_date&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; DATE&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;           │&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;                 │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;               │&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Calendar&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; date&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; of&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; the&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (extracted &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sale_timestamp&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)                                         │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;└──────────────────┴────────────────┴──────────┴─────────────────┴───────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Read&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; B&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; across&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; files&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; R2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;On&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; average,&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; B&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; s&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To learn more about the new aggregation capabilities and schema discovery commands, check out the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. If you&apos;re new to R2 SQL, visit our &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/get-started/&quot;&gt;getting started guide&lt;/a&gt; to begin querying your data.&lt;/p&gt;</description><pubDate>Fri, 12 Dec 2025 00:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Logs - SentinelOne as Logpush destination</title><link>https://developers.cloudflare.com/changelog/post/2025-12-11-sentinelone-destination/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-11-sentinelone-destination/</guid><description>&lt;p&gt;Cloudflare Logpush now supports &lt;strong&gt;SentinelOne&lt;/strong&gt; as a native destination.&lt;/p&gt;
&lt;p&gt;Logs from Cloudflare can be sent to &lt;a href=&quot;https://www.sentinelone.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SentinelOne AI SIEM&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; via &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/&quot;&gt;Logpush&lt;/a&gt;. The destination can be configured through the Logpush UI in the Cloudflare dashboard or by using the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/logpush/subresources/jobs/&quot;&gt;Logpush API&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, refer to the &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/enable-destinations/sentinelone/&quot;&gt;Destination Configuration&lt;/a&gt; documentation.&lt;/p&gt;</description><pubDate>Thu, 11 Dec 2025 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>WAF - WAF Release - 2025-12-11 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2025-12-11-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-11-emergency-waf-release/</guid><description>
&lt;p&gt;This emergency release introduces rules for CVE-2025-55183 and CVE-2025-55184, targeting server-side function exposure and resource-exhaustion patterns, respectively.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Added coverage for Leaking Server Functions (CVE-2025-55183) and React Function DoS detection (CVE-2025-55184).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These updates strengthen protection for server-function abuse techniques (CVE-2025-55183, CVE-2025-55184) that may expose internal logic or disrupt application availability.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;17c5123f1ac049818765ebf2fefb4e9b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...fefb4e9b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;React - Leaking Server Functions - CVE:CVE-2025-55183&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This was labeled as Generic - Server Function Source Code Exposure.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Free Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;3114709a3c3b4e3685052c7b251e86aa&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...251e86aa&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;React - Leaking Server Functions - CVE:CVE-2025-55183&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This was labeled as Generic - Server Function Source Code Exposure.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;2694f1610c0b471393b21aef102ec699&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...102ec699&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;React - DoS - CVE:CVE-2025-55184&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This was labeled as Generic – Server Function Resource Exhaustion.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Thu, 11 Dec 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>AI Crawl Control - Pay Per Crawl (Private beta) - Discovery API, custom pricing, and advanced configuration</title><link>https://developers.cloudflare.com/changelog/post/2025-12-10-pay-per-crawl-enhancements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-10-pay-per-crawl-enhancements/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;for-ai-crawler-operators&quot;&gt;For AI crawler operators&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#for-ai-crawler-operators&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;discovery-api&quot;&gt;Discovery API&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#discovery-api&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The API endpoint is &lt;code&gt;GET https://crawlers-api.ai-audit.cfdata.org/charged_zones&lt;/code&gt; and requires Web Bot Auth authentication. Refer to &lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-ai-owner/discover-payable-content/&quot;&gt;Discover payable content&lt;/a&gt; for authentication steps, request parameters, and response schema.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;payment-header-signature-requirement&quot;&gt;Payment header signature requirement&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#payment-header-signature-requirement&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Payment headers (&lt;code&gt;crawler-exact-price&lt;/code&gt; or &lt;code&gt;crawler-max-price&lt;/code&gt;) must now be included in the Web Bot Auth &lt;code&gt;signature-input&lt;/code&gt; 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 &lt;a href=&quot;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&quot;&gt;constructing the signature-input header&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-crawler-error-header&quot;&gt;New &lt;code&gt;crawler-error&lt;/code&gt; header&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-crawler-error-header&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Pay Per Crawl error responses now include a new &lt;code&gt;crawler-error&lt;/code&gt; header with 11 specific &lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-ai-owner/error-codes/&quot;&gt;error codes&lt;/a&gt; for programmatic handling. Error response bodies remain unchanged for compatibility. These codes enable robust error handling, automated retry logic, and accurate spending tracking.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;for-site-owners&quot;&gt;For site owners&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#for-site-owners&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;configure-free-pages&quot;&gt;Configure free pages&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#configure-free-pages&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Site owners can now offer free access to specific pages like homepages, navigation, or discovery pages while charging for other content. Create a &lt;a href=&quot;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&quot;&gt;Configuration Rule&lt;/a&gt; in &lt;strong&gt;Rules&lt;/strong&gt; &amp;gt; &lt;strong&gt;Configuration Rules&lt;/strong&gt;, set your URI pattern using wildcard, exact, or prefix matching on the &lt;strong&gt;URI Full&lt;/strong&gt; field, and enable the &lt;strong&gt;Disable Pay Per Crawl&lt;/strong&gt; setting. When disabled for a URI pattern, crawler requests pass through without blocking or charging.&lt;/p&gt;
&lt;p&gt;Some paths are always free to crawl. These paths are: &lt;code&gt;/robots.txt&lt;/code&gt;, &lt;code&gt;/sitemap.xml&lt;/code&gt;, &lt;code&gt;/security.txt&lt;/code&gt;, &lt;code&gt;/.well-known/security.txt&lt;/code&gt;, &lt;code&gt;/crawlers.json&lt;/code&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;AI crawler operators&lt;/strong&gt;: &lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-ai-owner/discover-payable-content/&quot;&gt;Discover payable content&lt;/a&gt; | &lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-ai-owner/crawl-pages/&quot;&gt;Crawl pages&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Site owners&lt;/strong&gt;: &lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/features/pay-per-crawl/use-pay-per-crawl-as-site-owner/advanced-configuration/&quot;&gt;Advanced configuration&lt;/a&gt;&lt;/p&gt;</description><pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate><product>AI Crawl Control</product><category>AI Crawl Control</category></item><item><title>WAF - WAF Release - 2025-12-10 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2025-12-10-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-10-emergency-waf-release/</guid><description>
&lt;p&gt;This additional week&apos;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Enhanced detection logic for React – RCE – CVE-2025-55182, added Generic – Server Function Source Code Exposure, and added Generic – Server Function Resource Exhaustion.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;bc1aee59731c488ca8b5314615fce168&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...15fce168&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;React - Remote Code Execution - CVE:CVE-2025-55182 - 2&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is an improved detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Free Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;cbdd3f48396e4b7389d6efd174746aff&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...74746aff&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;React - Remote Code Execution - CVE:CVE-2025-55182 - 2&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is an improved detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;17c5123f1ac049818765ebf2fefb4e9b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...fefb4e9b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic - Server Function Source Code Exposure&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Free Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;3114709a3c3b4e3685052c7b251e86aa&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...251e86aa&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic - Server Function Source Code Exposure&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;2694f1610c0b471393b21aef102ec699&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...102ec699&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic - Server Function Resource Exhaustion&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Cloudflare One Client - WARP client for Windows (version 2025.10.118.1)</title><link>https://developers.cloudflare.com/changelog/post/2025-12-09-warp-windows-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-09-warp-windows-beta/</guid><description>&lt;p&gt;A new Beta release for the Windows WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/&quot;&gt;beta releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes and improvements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/&quot;&gt;Local Domain Fallback&lt;/a&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode&quot;&gt;Proxy mode&lt;/a&gt; now supports transparent HTTP proxying in addition to CONNECT-based proxying.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd&quot;&gt;Windows 11 24H2 KB5062553&lt;/a&gt; or higher for resolution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Devices with KB5055523 installed may receive a warning about &lt;code&gt;Win32/ClickFix.ABA&lt;/code&gt; being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to &lt;a href=&quot;https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0&quot;&gt;version 1.429.19.0&lt;/a&gt; or later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS resolution may be broken when the following conditions are all true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.&lt;/li&gt;
&lt;li&gt;A custom DNS server address is configured on the primary network adapter.&lt;/li&gt;
&lt;li&gt;The custom DNS server address on the primary network adapter is changed while WARP is connected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To work around this issue, reconnect the WARP client by toggling off and back on.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 09 Dec 2025 23:03:10 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - WARP client for macOS (version 2025.10.118.1)</title><link>https://developers.cloudflare.com/changelog/post/2025-12-09-warp-macos-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-09-warp-macos-beta/</guid><description>&lt;p&gt;A new Beta release for the macOS WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/&quot;&gt;beta releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes and improvements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/&quot;&gt;Local Domain Fallback&lt;/a&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode&quot;&gt;Proxy mode&lt;/a&gt; now supports transparent HTTP proxying in addition to CONNECT-based proxying.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 09 Dec 2025 23:02:28 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Workers - Python cold start improvements</title><link>https://developers.cloudflare.com/changelog/post/2025-12-08-python-cold-start-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-08-python-cold-start-improvements/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;We set up a benchmark that imports common packages (&lt;a href=&quot;https://www.python-httpx.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;httpx&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;,
&lt;a href=&quot;https://fastapi.tiangolo.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;fastapi&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://docs.pydantic.dev/latest/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;pydantic&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)
to see how Python Workers stack up against other platforms:&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Mean Cold Start (ms)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Python Workers&lt;/td&gt;
&lt;td&gt;1027&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS Lambda&lt;/td&gt;
&lt;td&gt;2502&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Cloud Run&lt;/td&gt;
&lt;td&gt;3069&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;These benchmarks run continuously. You can view the results and the methodology on our &lt;a href=&quot;https://cold.edgeworker.net&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;benchmark page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To get started with Python Workers, check out our &lt;a href=&quot;https://developers.cloudflare.com/workers/languages/python/&quot;&gt;Python Workers overview&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Easy Python package management with Pywrangler</title><link>https://developers.cloudflare.com/changelog/post/2025-12-08-python-pywrangler/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-08-python-pywrangler/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;With Pywrangler, you specify your Worker&apos;s Python dependencies in your &lt;code&gt;pyproject.toml&lt;/code&gt; file:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;project&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;python-beautifulsoup-worker&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;version = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;0.1.0&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;description = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;A simple Worker using beautifulsoup4&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;requires-python = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&amp;gt;=3.12&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;dependencies = [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &quot;beautifulsoup4&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;dependency-groups&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;dev = [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  &quot;workers-py&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  &quot;workers-runtime-sdk&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;You can then develop and deploy your Worker using the following commands:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;uv&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; pywrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;uv&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; pywrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Pywrangler automatically downloads and vendors the necessary packages for your Worker, and these packages are bundled with the Worker when you deploy.&lt;/p&gt;
&lt;p&gt;Consult the &lt;a href=&quot;https://developers.cloudflare.com/workers/languages/python/packages/&quot;&gt;Python packages documentation&lt;/a&gt; for full details on Pywrangler and Python package management in Workers.&lt;/p&gt;</description><pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Wrangler config is optional when using Vite plugin</title><link>https://developers.cloudflare.com/changelog/post/2025-12-08-vite-optional-config/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-08-vite-optional-config/</guid><description>&lt;p&gt;When using the &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/&quot;&gt;Cloudflare Vite plugin&lt;/a&gt; to build and deploy Workers, a Wrangler configuration file is now optional for assets-only (static) sites. If no &lt;code&gt;wrangler.toml&lt;/code&gt;, &lt;code&gt;wrangler.json&lt;/code&gt;, or &lt;code&gt;wrangler.jsonc&lt;/code&gt; file is found, the plugin generates sensible defaults for an assets-only site. The &lt;code&gt;name&lt;/code&gt; is based on the &lt;code&gt;package.json&lt;/code&gt; or the project directory name, and the &lt;code&gt;compatibility_date&lt;/code&gt; uses the latest date supported by your installed Miniflare version.&lt;/p&gt;
&lt;p&gt;This allows easier setup for static sites using Vite. Note that SPAs will still need to &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/routing/single-page-application/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;set &lt;code&gt;assets.not_found_handling&lt;/code&gt; to &lt;code&gt;single-page-application&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; in order to function correctly.&lt;/p&gt;</description><pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Configure Workers programmatically using the Vite plugin</title><link>https://developers.cloudflare.com/changelog/post/2025-12-08-vite-programmatic-config/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-08-vite-programmatic-config/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/&quot;&gt;Cloudflare Vite plugin&lt;/a&gt; now supports programmatic configuration of Workers without a Wrangler configuration file. You can use the &lt;code&gt;config&lt;/code&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;the-config-option&quot;&gt;The &lt;code&gt;config&lt;/code&gt; option&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-config-option&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The Vite plugin&apos;s new &lt;code&gt;config&lt;/code&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-usage&quot;&gt;Example usage&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-usage&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Setting &lt;code&gt;config&lt;/code&gt; to an object to provide configuration values that merge with defaults and config file settings:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;vite.config.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { defineConfig } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;vite&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { cloudflare } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/vite-plugin&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineConfig&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	plugins: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		cloudflare&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			config: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				compatibility_flags: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;nodejs_compat&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				send_email: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;EMAIL&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Use a function to modify the existing configuration:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;vite.config.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { defineConfig } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;vite&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { cloudflare } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/vite-plugin&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineConfig&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	plugins: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		cloudflare&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			config&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;userConfig&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				delete&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; userConfig.compatibility_flags;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Return an object with values to merge:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;vite.config.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { defineConfig } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;vite&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { cloudflare } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/vite-plugin&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineConfig&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	plugins: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		cloudflare&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;			config&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;userConfig&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;userConfig.compatibility_flags.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;no_nodejs_compat&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;					return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { compatibility_flags: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;nodejs_compat&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;] };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;auxiliary-workers&quot;&gt;Auxiliary Workers&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#auxiliary-workers&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Auxiliary Workers also support the &lt;code&gt;config&lt;/code&gt; option, enabling multi-Worker architectures without config files.&lt;/p&gt;
&lt;p&gt;Define auxiliary Workers without config files using &lt;code&gt;config&lt;/code&gt; inside the &lt;code&gt;auxiliaryWorkers&lt;/code&gt; array:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;vite.config.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { defineConfig } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;vite&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { cloudflare } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/vite-plugin&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineConfig&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	plugins: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		cloudflare&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			config: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;entry-worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				main: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./src/entry.ts&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				services: [{ binding: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;API&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, service: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;api-worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			auxiliaryWorkers: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					config: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;api-worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;						main: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./src/api.ts&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;					},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;For more details and examples, see &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/reference/programmatic-configuration/&quot;&gt;Programmatic configuration&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare Fundamentals, Terraform - Terraform v5.14.0 now available</title><link>https://developers.cloudflare.com/changelog/post/2025-12-05-terraform-v5.14.0-provider/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-05-terraform-v5.14.0-provider/</guid><description>&lt;p&gt;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 &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/5774&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2-3 week cadence&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to ensure its stability and reliability, including the v5.14 release. We have also pivoted from an &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;issue-to-issue approach to a resource-per-resource approach&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; - 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.&lt;/p&gt;
&lt;p&gt;Thank you for continuing to raise issues. They make our provider stronger and help us build products that reflect your needs.&lt;/p&gt;
&lt;p&gt;This release includes bug fixes, the stabilization of even more popular resources, and more.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;deprecation-notice&quot;&gt;Deprecation notice&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#deprecation-notice&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Resource affected: &lt;code&gt;api_shield_discovery_operation&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The corresponding public API endpoint of &lt;a href=&quot;https://developers.cloudflare.com/api/resources/api_gateway/subresources/discovery/subresources/operations/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;discovered operations&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; is not affected and will continue to be supported.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;features&quot;&gt;Features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;pages_project&lt;/strong&gt;: Add v4 -&amp;gt; v5 migration tests (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/pull/6506&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6506&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;bug-fixes&quot;&gt;Bug fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bug-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;account_members&lt;/strong&gt;: Makes member policies a set (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6488&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6488&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pages_project&lt;/strong&gt;: Ensures non empty refresh plans (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6515&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6515&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;R2&lt;/strong&gt;: Improves sweeper (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6512&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6512&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_kv&lt;/strong&gt;: Ignores value import state for verify (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6521&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6521&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_script&lt;/strong&gt;: No longer treats the migrations attribute as WriteOnly (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6489&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6489&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_script&lt;/strong&gt;: Resolves resource drift when worker has unmanaged secret (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6504&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6504&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_device_posture_rule&lt;/strong&gt;: Preserves input.version and other fields (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6500&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6500&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;) and (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6503&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6503&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_dlp_custom_profile&lt;/strong&gt;: Adds sweepers for &lt;code&gt;dlp_custom_profile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zone_subscription|account_subscription&lt;/strong&gt;: Adds &lt;code&gt;partners_ent&lt;/code&gt; as valid enum for &lt;code&gt;rate_plan.id&lt;/code&gt; (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6505&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6505&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zone&lt;/strong&gt;: Ensures datasource model schema parity (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6487&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6487&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;subscription&lt;/strong&gt;: Updates import signature to accept account_id/subscription_id to import account subscription (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6510&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6510&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade-to-newer-version&quot;&gt;Upgrade to newer version&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade-to-newer-version&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;stabilized&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. We will be releasing a new migration tool in March 2026 to help support v4 to v5 transitions for our most popular resources.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;for-more-information&quot;&gt;For more information&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#for-more-information&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Terraform Provider&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/terraform/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Documentation on using Terraform with Cloudflare&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>Terraform</category></item><item><title>WAF - Increased WAF payload limit for all plans</title><link>https://developers.cloudflare.com/changelog/post/2025-12-05-rcs-vuln/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-05-rcs-vuln/</guid><description>&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; We later reinstated the maximum request-payload size the Cloudflare WAF inspects. Refer to &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-12-05-waf-max-payload-size-change/&quot;&gt;Updating the WAF maximum payload values&lt;/a&gt; for details.&lt;/p&gt;</description><pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>WAF - Updating the WAF maximum payload values</title><link>https://developers.cloudflare.com/changelog/post/2025-12-05-waf-max-payload-size-change/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-05-waf-max-payload-size-change/</guid><description>&lt;p&gt;We are reinstating the maximum request-payload size the Cloudflare WAF inspects, with WAF on Enterprise zones inspecting up to 128 KB.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-12-05-rcs-vuln/&quot;&gt;December 5, 2025&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;This issue was particularly notable within the Cloudflare Managed Ruleset and the Cloudflare OWASP Core Ruleset, impacting customer traffic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</description><pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Hyperdrive - Connect to remote databases during local development with wrangler dev</title><link>https://developers.cloudflare.com/changelog/post/2025-12-04-hyperdrive-remote-database-local-dev/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-04-hyperdrive-remote-database-local-dev/</guid><description>&lt;p&gt;You can now connect directly to remote databases and databases requiring TLS with &lt;code&gt;wrangler dev&lt;/code&gt;.
This lets you run your Worker code locally while connecting to remote databases, without needing to use &lt;code&gt;wrangler dev --remote&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;localConnectionString&lt;/code&gt; field and &lt;code&gt;CLOUDFLARE_HYPERDRIVE_LOCAL_CONNECTION_STRING_&amp;lt;BINDING_NAME&amp;gt;&lt;/code&gt; environment variable can be used to configure the connection string used by &lt;code&gt;wrangler dev&lt;/code&gt;.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;hyperdrive&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;HYPERDRIVE&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;your-hyperdrive-id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;localConnectionString&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;postgres://user:password@remote-host.example.com:5432/database?sslmode=require&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/hyperdrive/configuration/local-development/&quot;&gt;local development with Hyperdrive&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate><product>Hyperdrive</product><category>Hyperdrive</category></item><item><title>Workers - One-click Access protection for Workers now creates reusable Cloudflare Access policies</title><link>https://developers.cloudflare.com/changelog/post/2025-12-03-reusable-access-policies/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-03-reusable-access-policies/</guid><description>&lt;p&gt;Workers applications now use reusable &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/&quot;&gt;Cloudflare Access policies&lt;/a&gt; to reduce duplication and simplify access management across multiple Workers.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Preview URLs&lt;/strong&gt;: All Workers preview URLs share a single &quot;Cloudflare Workers Preview URLs&quot; 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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Production workers.dev URLs&lt;/strong&gt;: When enabled, each Worker gets its own reusable policy (named &lt;code&gt;&amp;lt;worker-name&amp;gt; - Production&lt;/code&gt;) 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&apos;s not being used by other applications.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To enable Cloudflare Access on your Worker:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the Cloudflare dashboard, go to &lt;strong&gt;Workers &amp;amp; Pages&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select your Worker.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Domains &amp;amp; Routes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For &lt;code&gt;workers.dev&lt;/code&gt; or Preview URLs, click &lt;strong&gt;Enable Cloudflare Access&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Optionally, click &lt;strong&gt;Manage Cloudflare Access&lt;/strong&gt; to customize the policy.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For more information on configuring Cloudflare Access for Workers, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/routing/workers-dev/#manage-access-to-workersdev&quot;&gt;Workers Access documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Email security - Reclassifications to Submissions</title><link>https://developers.cloudflare.com/changelog/post/2025-12-03-submission-terminology-update/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-03-submission-terminology-update/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=756,height=628,format=webp/_astro/reclassification-submission.B6nL5Hw7.png&quot; alt=&quot;nav_example&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;756&quot; height=&quot;628&quot;&gt;
&lt;p&gt;This applies to all Email Security packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advantage&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise + PhishGuard&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Wed, 03 Dec 2025 21:11:33 GMT</pubDate><product>Email security</product><category>Email security</category></item><item><title>WAF - WAF Release - 2025-12-03 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2025-12-03-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-03-emergency-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rule description updated to reference React – RCE – CVE-2025-55182 while retaining existing unsafe-deserialization detection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Improved classification and traceability with no change to coverage against remote code execution attempts.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;33aa8a8a948b48b28d40450c5fb92fba&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...5fb92fba&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;React - RCE - CVE:CVE-2025-55182&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;Rule metadata description changed. Detection unchanged.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Free Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;2b5d06e34a814a889bee9a0699702280&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...99702280&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;React - RCE - CVE:CVE-2025-55182&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;Rule metadata description changed. Detection unchanged.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Wed, 03 Dec 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>WAF - WAF Release - 2025-12-02 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2025-12-02-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-02-emergency-waf-release/</guid><description>
&lt;p&gt;This week&apos;s emergency release introduces a new rule to block a critical RCE vulnerability in widely-used web frameworks through unsafe deserialization patterns.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;33aa8a8a948b48b28d40450c5fb92fba&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...5fb92fba&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;RCE Generic - Framework&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Free Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;2b5d06e34a814a889bee9a0699702280&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...99702280&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;RCE Generic - Framework&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Tue, 02 Dec 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>WAF - WAF Release - 2025-12-01</title><link>https://developers.cloudflare.com/changelog/post/2025-12-01-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-12-01-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;480da5e7984542a6b8d8d88da4fcc8a8&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...a4fcc8a8&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Monsta FTP - Remote Code Execution - CVE:CVE-2025-34299&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;2380b125c53d42ac94479c42b7492846&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...b7492846&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;XSS - JS Context Escape - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule is merged into the original rule &quot;XSS - JS Context Escape&quot; (ID: &lt;rule-id id=&quot;c1ad1bc37caa4cbeb104f44f7a3769d3&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...7a3769d3&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 01 Dec 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Agents, Workers - Agents SDK v0.2.24 with resumable streaming, MCP improvements, and schedule fixes</title><link>https://developers.cloudflare.com/changelog/post/2025-11-26-agents-resumable-streaming/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-26-agents-resumable-streaming/</guid><description>&lt;p&gt;The latest release of &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;@cloudflare/agents&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; brings resumable streaming, significant MCP client improvements, and critical fixes for schedules and Durable Object lifecycle management.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;resumable-streaming&quot;&gt;Resumable streaming&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#resumable-streaming&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;AIChatAgent&lt;/code&gt; now supports resumable streaming, allowing clients to reconnect and continue receiving streamed responses without losing data. This is useful for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Long-running AI responses&lt;/li&gt;
&lt;li&gt;Users on unreliable networks&lt;/li&gt;
&lt;li&gt;Users switching between devices mid-conversation&lt;/li&gt;
&lt;li&gt;Background tasks where users navigate away and return&lt;/li&gt;
&lt;li&gt;Real-time collaboration where multiple clients need to stay in sync&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Streams are maintained across page refreshes, broken connections, and syncing across open tabs and devices.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;other-improvements&quot;&gt;Other improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#other-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Default JSON schema validator added to MCP client&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/agents/runtime/execution/schedule-tasks/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Schedules&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; can now safely destroy the agent&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;mcp-client-api-improvements&quot;&gt;MCP client API improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#mcp-client-api-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;MCPClientManager&lt;/code&gt; API has been redesigned for better clarity and control:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New &lt;code&gt;registerServer()&lt;/code&gt; method&lt;/strong&gt;: Register MCP servers without immediately connecting&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New &lt;code&gt;connectToServer()&lt;/code&gt; method&lt;/strong&gt;: Establish connections to registered servers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improved reconnect logic&lt;/strong&gt;: &lt;code&gt;restoreConnectionsFromStorage()&lt;/code&gt; now properly handles failed connections&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Register a server to Agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.mcp.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;registerServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	url: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://my-mcp-server.example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Connect when ready&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.mcp.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;connectToServer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(id);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Discover tools, prompts and resources&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.mcp.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;discoverIfConnected&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(id);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;The SDK now includes a formalized &lt;code&gt;MCPConnectionState&lt;/code&gt; enum with states: &lt;code&gt;idle&lt;/code&gt;, &lt;code&gt;connecting&lt;/code&gt;, &lt;code&gt;authenticating&lt;/code&gt;, &lt;code&gt;connected&lt;/code&gt;, &lt;code&gt;discovering&lt;/code&gt;, and &lt;code&gt;ready&lt;/code&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;enhanced-mcp-discovery&quot;&gt;Enhanced MCP discovery&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#enhanced-mcp-discovery&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;MCP discovery fetches the available tools, prompts, and resources from an MCP server so your agent knows what capabilities are available. The &lt;code&gt;MCPClientConnection&lt;/code&gt; class now includes a dedicated &lt;code&gt;discover()&lt;/code&gt; method with improved reliability:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Supports cancellation via AbortController&lt;/li&gt;
&lt;li&gt;Configurable timeout (default 15s)&lt;/li&gt;
&lt;li&gt;Discovery failures now throw errors immediately instead of silently continuing&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;bug-fixes&quot;&gt;Bug fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bug-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a bug where &lt;a href=&quot;https://developers.cloudflare.com/agents/runtime/execution/schedule-tasks/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;schedules&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; meant to fire immediately with this.schedule(0, ...) or &lt;code&gt;this.schedule(new Date(), ...)&lt;/code&gt; would not fire&lt;/li&gt;
&lt;li&gt;Fixed an issue where schedules that took longer than 30 seconds would occasionally time out&lt;/li&gt;
&lt;li&gt;Fixed SSE transport now properly forwards session IDs and request headers&lt;/li&gt;
&lt;li&gt;Fixed AI SDK stream events conversion to UIMessageStreamPart&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrade&quot;&gt;Upgrade&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrade&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To update to the latest version:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; agents@latest&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><pubDate>Wed, 26 Nov 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>API Shield - New Zombie API detection for API Shield</title><link>https://developers.cloudflare.com/changelog/post/2025-11-25-zombie-endpoint-risk-label/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-25-zombie-endpoint-risk-label/</guid><description>&lt;p&gt;API Shield now automatically detects zombie endpoints — saved endpoints that have not received traffic for an extended period. When detected, the &lt;code&gt;cf-risk-zombie&lt;/code&gt; &lt;a href=&quot;https://developers.cloudflare.com/api-shield/management-and-monitoring/endpoint-labels/#risk-labels&quot;&gt;risk label&lt;/a&gt; is applied.&lt;/p&gt;
&lt;p&gt;The scan runs daily alongside existing risk scans. Endpoints are labeled after 32 days without traffic.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/api-shield/security/schema-validation/#add-validation-by-adding-a-fallthrough-rule&quot;&gt;fallthrough rule&lt;/a&gt; to prevent communication with endpoints removed from Endpoint Management.&lt;/p&gt;</description><pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate><product>API Shield</product><category>API Shield</category></item><item><title>Cache - Audit Logs for Cache Purge Events</title><link>https://developers.cloudflare.com/changelog/post/2025-11-25-audit-logs-for-cache-purge-events/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-25-audit-logs-for-cache-purge-events/</guid><description>&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Purge everything&lt;/li&gt;
&lt;li&gt;List of prefixes&lt;/li&gt;
&lt;li&gt;List of tags&lt;/li&gt;
&lt;li&gt;List of hosts&lt;/li&gt;
&lt;li&gt;List of files&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example&quot;&gt;Example&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The detailed audit payload is visible within the Cloudflare Dashboard (under &lt;strong&gt;Manage Account&lt;/strong&gt; &amp;gt; &lt;strong&gt;Audit Logs&lt;/strong&gt;) and via the API. Below is an example of the Audit Logs v2 payload structure:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;action&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;result&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;success&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;create&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;actor&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;1234567890abcdef&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;email&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user@example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;resource&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;product&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;purge_cache&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;request&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;files&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;https://example.com/images/logo.png&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;https://example.com/css/styles.css&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;zone&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;023e105f4ecef8ad9ca31a8372d0c353&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;example.com&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/account/account-security/audit-logs/&quot;&gt;Audit Logs documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate><product>Cache</product><category>Cache</category></item><item><title>Workers AI - Launching FLUX.2 [dev] on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2025-11-25-flux-2-dev-workers-ai/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-25-flux-2-dev-workers-ai/</guid><description>&lt;p&gt;We&apos;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.&lt;/p&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://bfl.ai/flux2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;BFL blog&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to learn more about the model itself. Read our &lt;a href=&quot;https://blog.cloudflare.com/flux-2-workers-ai&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare blog&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to see the model in action, or try it out yourself on our &lt;a href=&quot;https://multi-modal.ai.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;multi modal playground&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pricing documentation is available on the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/flux-2-dev/&quot;&gt;model page&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/platform/pricing/&quot;&gt;pricing page&lt;/a&gt;. Note, we expect to drop pricing in the next few days after iterating on the model performance.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;workers-ai-platform-specifics&quot;&gt;Workers AI Platform specifics&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#workers-ai-platform-specifics&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;With the REST API, the multipart form data input looks like this:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --request&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --url&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-dev&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer {TOKEN}&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --header&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Content-Type: multipart/form-data&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --form&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;prompt=a sunset at the alps&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --form&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; steps=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;25&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;  --form&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; width=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1024&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;  --form&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; height=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1024&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;With the Workers AI binding, you can use it as such:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; form&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; FormData&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;prompt&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;a sunset with a dog&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;width&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;1024&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;height&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;1024&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//this dummy request is temporary hack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//we&apos;re pushing a change to address this soon&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formRequest&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;http://dummy&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  method: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;POST&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  body: form&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formStream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; formRequest.body;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formContentType&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; formRequest.headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;content-type&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;multipart/form-data&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; resp&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/black-forest-labs/flux-2-dev&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  multipart: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    body: formStream,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    contentType: formContentType&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;The parameters you can send to the model are detailed here:&lt;/p&gt;
&lt;details&gt;&lt;p&gt;&lt;summary&gt;JSON Schema for Model&lt;/summary&gt;
&lt;strong&gt;Required Parameters&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;prompt&lt;/code&gt; (string) - Text description of the image to generate&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Optional Parameters&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;input_image_0&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_1&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_2&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;input_image_3&lt;/code&gt; (string) - Binary image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;steps&lt;/code&gt; (integer) - Number of inference steps. Higher values may improve quality but increase generation time&lt;/li&gt;
&lt;li&gt;&lt;code&gt;guidance&lt;/code&gt; (float) - Guidance scale for generation. Higher values follow the prompt more closely&lt;/li&gt;
&lt;li&gt;&lt;code&gt;width&lt;/code&gt; (integer) - Width of the image, default &lt;code&gt;1024&lt;/code&gt; Range: 256-1920&lt;/li&gt;
&lt;li&gt;&lt;code&gt;height&lt;/code&gt; (integer) - Height of the image, default &lt;code&gt;768&lt;/code&gt; Range: 256-1920&lt;/li&gt;
&lt;li&gt;&lt;code&gt;seed&lt;/code&gt; (integer) - Seed for reproducibility&lt;/li&gt;
&lt;/ul&gt;&lt;/details&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;plaintext&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot; data-nb-lang=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;## Multi-Reference Images&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;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.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;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`.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;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.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;```bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;curl --request POST \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --url &apos;https://api.cloudflare.com/client/v4/accounts/{ACCOUNT}/ai/run/@cf/black-forest-labs/flux-2-dev&apos; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --header &apos;Authorization: Bearer {TOKEN}&apos; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --header &apos;Content-Type: multipart/form-data&apos; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --form &apos;prompt=take the subject of image 1 and style it like image 0&apos; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --form input_image_0=@/Users/johndoe/Desktop/icedoutkeanu.png \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --form input_image_1=@/Users/johndoe/Desktop/me.png \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --form steps=25&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --form width=1024&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;  --form height=1024&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Through Workers AI Binding:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//helper function to convert ReadableStream to Blob&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; function&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamToBlob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;stream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ReadableStream&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;contentType&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Blob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; reader&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stream.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getReader&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; chunks&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  while&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; reader.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;read&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (done) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;break&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    chunks.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(value);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Blob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(chunks, { type: contentType });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; image0&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;http://image-url&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; image1&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;http://image-url&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; form&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; FormData&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; image_blob0&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamToBlob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(image0.body, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;image/png&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; image_blob1&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamToBlob&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(image1.body, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;image/png&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;input_image_0&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, image_blob0)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;input_image_1&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, image_blob1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;form.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;append&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;prompt&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;take the subject of image 1and style it like image 0&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//this dummy request is temporary hack&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//we&apos;re pushing a change to address this soon&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formRequest&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;http://dummy&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  method: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;POST&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  body: form&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formStream&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; formRequest.body;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; formContentType&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; formRequest.headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;content-type&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;multipart/form-data&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; resp&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/black-forest-labs/flux-2-dev&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    multipart: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        body: form,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        contentType: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;multipart/form-data&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;json-prompting&quot;&gt;JSON Prompting&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#json-prompting&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The model supports prompting in JSON to get more granular control over images. You would pass the JSON as the value of the &apos;prompt&apos; field in the multipart form data. See the JSON schema below on the base parameters you can pass to the model.&lt;/p&gt;
&lt;details&gt;&lt;summary&gt;JSON Prompting Schema&lt;/summary&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;properties&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;scene&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Overall scene setting or location&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;subjects&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;array&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;items&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;        &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;        &quot;properties&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;            &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;            &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Type of subject (e.g., desert nomad, blacksmith, DJ, falcon)&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;          },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;            &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;            &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Physical attributes, clothing, accessories&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;          },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;pose&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;            &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;            &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Action or stance&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;          },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;position&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;            &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;            &quot;enum&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;foreground&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;midground&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;background&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;            &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Depth placement in scene&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;          }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;        &quot;required&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;pose&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;position&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;style&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Artistic rendering style (e.g., digital painting, photorealistic, pixel art, noir sci-fi, lifestyle photo, wabi-sabi photo)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;color_palette&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;array&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;items&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;minItems&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;maxItems&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Exactly 3 main colors for the scene (e.g., [&apos;navy&apos;, &apos;neon yellow&apos;, &apos;magenta&apos;])&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;lighting&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Lighting condition and direction (e.g., fog-filtered sun, moonlight with star glints, dappled sunlight)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;mood&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Emotional atmosphere (e.g., harsh and determined, playful and modern, peaceful and dreamy)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;background&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Background environment details&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;composition&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;enum&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;rule of thirds&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;circular arrangement&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;framed by foreground&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;minimalist negative space&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;S-curve&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;vanishing point center&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;dynamic off-center&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;leading leads&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;golden spiral&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;diagonal energy&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;strong verticals&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;        &quot;triangular arrangement&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      ],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Compositional technique&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;camera&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;object&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;properties&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;        &quot;angle&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;enum&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;eye level&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;low angle&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;slightly low&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;bird&apos;s-eye&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;worm&apos;s-eye&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;over-the-shoulder&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;isometric&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Camera perspective&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;        &quot;distance&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;enum&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;close-up&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;medium close-up&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;medium shot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;medium wide&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;wide shot&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;extreme wide&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Framing distance&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;        &quot;focus&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;enum&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;deep focus&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;macro focus&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;selective focus&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;sharp on subject&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;soft background&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Focus type&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;        &quot;lens&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;enum&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;14mm&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;24mm&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;35mm&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;50mm&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;70mm&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;85mm&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Focal length (wide to telephoto)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;        &quot;f-number&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Aperture (e.g., f/2.8, the smaller the number the more blurry the background)&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;        &quot;ISO&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;number&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;          &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Light sensitivity value (comfortable range between 100 &amp;amp; 6400, lower = less sensitivity)&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;effects&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;array&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;items&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;description&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Post-processing effects (e.g., &apos;lens flare small&apos;, &apos;subtle film grain&apos;, &apos;soft bloom&apos;, &apos;god rays&apos;, &apos;chromatic aberration mild&apos;)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;required&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;scene&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;subjects&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/details&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;other-features-to-try&quot;&gt;Other features to try&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#other-features-to-try&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;The model also supports the most common latin and non-latin character languages&lt;/li&gt;
&lt;li&gt;You can prompt the model with specific hex codes like &lt;code&gt;#2ECC71&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Try creating digital assets like landing pages, comic strips, infographics too!&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Radar - Cloud Services Observability in Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2025-11-24-radar-cloud-observability/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-24-radar-cloud-observability/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; introduces HTTP Origins insights, providing visibility into the status of traffic between Cloudflare&apos;s global network and cloud-based origin infrastructure.&lt;/p&gt;
&lt;p&gt;The new &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/origins/&quot;&gt;&lt;code&gt;Origins&lt;/code&gt;&lt;/a&gt; API provides provides the following endpoints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/origins/methods/list/&quot;&gt;&lt;code&gt;/origins&lt;/code&gt;&lt;/a&gt; - Lists all origins (cloud providers and associated regions).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/origins/methods/get/&quot;&gt;&lt;code&gt;/origins/{origin}&lt;/code&gt;&lt;/a&gt; - Retrieves information about a specific origin (cloud provider).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/origins/methods/timeseries/&quot;&gt;&lt;code&gt;/origins/timeseries&lt;/code&gt;&lt;/a&gt; - Retrieves normalized time series data for a specific origin, including the following metrics:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;REQUESTS&lt;/code&gt;: Number of requests&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CONNECTION_FAILURES&lt;/code&gt;: Number of connection failures&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RESPONSE_HEADER_RECEIVE_DURATION&lt;/code&gt;: Duration of the response header receive&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TCP_HANDSHAKE_DURATION&lt;/code&gt;: Duration of the TCP handshake&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TCP_RTT&lt;/code&gt;: TCP round trip time&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TLS_HANDSHAKE_DURATION&lt;/code&gt;: Duration of the TLS handshake&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/origins/methods/summary/&quot;&gt;&lt;code&gt;/origins/summary&lt;/code&gt;&lt;/a&gt; - Retrieves HTTP requests to origins summarized by a dimension.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/origins/methods/timeseries_groups/&quot;&gt;&lt;code&gt;/origins/timeseries_groups&lt;/code&gt;&lt;/a&gt; - Retrieves timeseries data for HTTP requests to origins grouped by a dimension.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following dimensions are available for the &lt;code&gt;summary&lt;/code&gt; and &lt;code&gt;timeseries_groups&lt;/code&gt; endpoints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;region&lt;/code&gt;: Origin region&lt;/li&gt;
&lt;li&gt;&lt;code&gt;success_rate&lt;/code&gt;: Success rate of requests (2XX versus 5XX response codes)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;percentile&lt;/code&gt;: Percentiles of metrics listed above&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/annotations/&quot;&gt;&lt;code&gt;Annotations&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/traffic_anomalies/&quot;&gt;&lt;code&gt;Traffic Anomalies&lt;/code&gt;&lt;/a&gt; APIs have been extended to support origin outages and anomalies, enabling automated detection and alerting for origin infrastructure issues.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=970,format=webp/_astro/cloud-service-status.DoGHSNmz.png&quot; alt=&quot;Screenshot of the cloud service status heatmap&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;970&quot;&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://radar.cloudflare.com/cloud-observatory&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;new Radar page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 24 Nov 2025 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>WAF - WAF Release - 2025-11-24</title><link>https://developers.cloudflare.com/changelog/post/2025-11-24-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-24-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This vulnerability enables an unauthenticated attacker to bypass access controls by abusing the &lt;code&gt;CGIINFO&lt;/code&gt; header. The latest update strengthens detection logic to ensure a reliable identification of crafted requests attempting to exploit this flaw.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FortiWeb (CVE-2025-64446): Exploitation allows a remote unauthenticated adversary to circumvent authentication mechanisms by sending a manipulated &lt;code&gt;CGIINFO&lt;/code&gt; header to FortiWeb’s backend CGI handler. Successful exploitation grants unintended access to restricted administrative functionality, potentially enabling configuration tampering or system-level actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;b957ace6e9844bf29244401c4e2e1a2e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...4e2e1a2e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;FortiWeb - Authentication Bypass via CGIINFO Header - CVE:CVE-2025-64446&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;e3871391a93248fa98a78e03b6c44ed5&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...b6c44ed5&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;PHP Wrapper Injection - Body - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This rule has been merged into the original rule &quot;PHP Wrapper Injection - Body&quot; (ID:&lt;rule-id id=&quot;fae6fa37ae9249d58628e54b1a3e521e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1a3e521e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;e6b1b66e0e3b46969102baed900f4015&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...900f4015&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;PHP Wrapper Injection - URI - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This rule has been merged into the original rule &quot;PHP Wrapper Injection - URI&quot; (ID:&lt;rule-id id=&quot;9c02e585db34440da620eb668f76bd74&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8f76bd74&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 24 Nov 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Containers, R2 - Mount R2 buckets in Containers</title><link>https://developers.cloudflare.com/changelog/post/2025-11-21-fuse-support-in-containers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-21-fuse-support-in-containers/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt; now support mounting R2 buckets as FUSE (Filesystem in Userspace) volumes, allowing applications to interact with &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt; using standard filesystem operations.&lt;/p&gt;
&lt;p&gt;Common use cases include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bootstrapping containers with datasets, models, or dependencies for &lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;sandboxes&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/agents/&quot;&gt;agent&lt;/a&gt; environments&lt;/li&gt;
&lt;li&gt;Persisting user configuration or application state without managing downloads&lt;/li&gt;
&lt;li&gt;Accessing large static files without bloating container images or downloading at startup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;FUSE adapters like &lt;a href=&quot;https://github.com/tigrisdata/tigrisfs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;tigrisfs&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, &lt;a href=&quot;https://github.com/s3fs-fuse/s3fs-fuse&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;s3fs&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://github.com/GoogleCloudPlatform/gcsfuse&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;gcsfuse&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; can be installed in your container image and configured to mount buckets at startup.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;dockerfile&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;dockerfile&quot; data-nb-lang=&quot;dockerfile&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; alpine:3.20&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Install FUSE and dependencies&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;RUN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; apk update &amp;amp;&amp;amp; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    apk add --no-cache ca-certificates fuse curl bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Install tigrisfs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;RUN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ARCH=$(uname -m) &amp;amp;&amp;amp; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    if [ &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;$ARCH&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;x86_64&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ]; then ARCH=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;amd64&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;; fi &amp;amp;&amp;amp; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    if [ &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;$ARCH&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;aarch64&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ]; then ARCH=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;arm64&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;; fi &amp;amp;&amp;amp; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    VERSION=$(curl -s https://api.github.com/repos/tigrisdata/tigrisfs/releases/latest | grep -o &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;&quot;tag_name&quot;: &quot;[^&quot;]*&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; | cut -d&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;&quot;&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; -f4) &amp;amp;&amp;amp; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    curl -L &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://github.com/tigrisdata/tigrisfs/releases/download/${VERSION}/tigrisfs_${VERSION#v}_linux_${ARCH}.tar.gz&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; -o /tmp/tigrisfs.tar.gz &amp;amp;&amp;amp; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    tar -xzf /tmp/tigrisfs.tar.gz -C /usr/local/bin/ &amp;amp;&amp;amp; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    rm /tmp/tigrisfs.tar.gz &amp;amp;&amp;amp; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    chmod +x /usr/local/bin/tigrisfs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Create startup script that mounts bucket&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;RUN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; printf &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;#!/bin/sh&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    set -e&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    mkdir -p /mnt/r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    R2_ENDPOINT=&quot;https://${R2_ACCOUNT_ID}.r2.cloudflarestorage.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    /usr/local/bin/tigrisfs --endpoint &quot;${R2_ENDPOINT}&quot; -f &quot;${BUCKET_NAME}&quot; /mnt/r2 &amp;amp;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    sleep 3&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    ls -lah /mnt/r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    &apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; &amp;gt; /startup.sh &amp;amp;&amp;amp; chmod +x /startup.sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;CMD&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;/startup.sh&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/containers/examples/r2-fuse-mount/&quot;&gt;Mount R2 buckets with FUSE&lt;/a&gt; example for a complete guide on mounting R2 buckets and/or other S3-compatible storage buckets within your containers.&lt;/p&gt;</description><pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category><category>R2</category></item><item><title>Containers - New CPU Pricing for Containers and Sandboxes</title><link>https://developers.cloudflare.com/changelog/post/2025-11-21-new-cpu-pricing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-21-new-cpu-pricing/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/containers/&quot;&gt;Containers&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt; pricing for CPU time is now based on active usage only, instead of provisioned resources.&lt;/p&gt;
&lt;p&gt;This means that you now pay less for Containers and Sandboxes.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;an-example-before-and-after&quot;&gt;An Example Before and After&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#an-example-before-and-after&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Imagine running the &lt;code&gt;standard-2&lt;/code&gt; instance type for one hour, which can use up to 1 vCPU,
but on average you use only 20% of your CPU capacity.&lt;/p&gt;
&lt;p&gt;CPU-time is priced at &lt;em&gt;$0.00002 per vCPU-second&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Previously, you would be charged for the CPU allocated to the instance multiplied by the time it was active, in this case 1 hour.&lt;/p&gt;
&lt;p&gt;CPU cost would have been: &lt;strong&gt;$0.072&lt;/strong&gt; — 1 vCPU * 3600 seconds * $0.00002&lt;/p&gt;
&lt;p&gt;Now, since you are only using 20% of your CPU capacity, your CPU cost is cut to 20% of the previous amount.&lt;/p&gt;
&lt;p&gt;CPU cost is now: &lt;strong&gt;$0.0144&lt;/strong&gt; — 1 vCPU * 3600 seconds * $0.00002 * 20% utilization&lt;/p&gt;
&lt;p&gt;This can significantly reduce costs for Containers and Sandboxes.&lt;/p&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;Memory cost and disk pricing remain unchanged, and is still calculated based on &lt;em&gt;provisioned&lt;/em&gt; resources.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;See the documentation to learn more about &lt;a href=&quot;https://developers.cloudflare.com/containers/get-started/&quot;&gt;Containers&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/sandbox/&quot;&gt;Sandboxes&lt;/a&gt;,
and &lt;a href=&quot;https://developers.cloudflare.com/containers/pricing&quot;&gt;associated pricing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Security Center - Threat insights are now available in the Threat Events platform</title><link>https://developers.cloudflare.com/changelog/post/2025-11-21-Threat-Events-now-show-events-insights/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-21-Threat-Events-now-show-events-insights/</guid><description>&lt;p&gt;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 &lt;code&gt;lightning icon&lt;/code&gt; and the insights can refer to multiple, connected events, potentially part of the same attack or campaign and associated with the same threat actor.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/security-center/cloudforce-one/#analyze-threat-events&quot;&gt;Analyze threat events&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>WAF - WAF Release - 2025-11-21</title><link>https://developers.cloudflare.com/changelog/post/2025-11-21-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-21-emergency-waf-release/</guid><description>
&lt;p&gt;This week’s release introduces a critical detection for CVE-2025-61757, a vulnerability in the Oracle Identity Manager REST WebServices component.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This flaw allows unauthenticated attackers with network access over HTTP to fully compromise the Identity Manager, potentially leading to a complete takeover.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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&apos;s message processor. This enables the creation of arbitrary employee accounts, which can be leveraged to modify system configurations and achieve full system compromise.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;fa584616fe2241608cb8bd1339fdbe7e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...39fdbe7e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Oracle Identity Manager - Pre-Auth RCE - CVE:CVE-2025-61757&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - Environment variable limits increase for Workers Builds</title><link>https://developers.cloudflare.com/changelog/post/2025-11-21-builds-env-var-increase/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-21-builds-env-var-increase/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/&quot;&gt;Workers Builds&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;This change enables better support for complex build configurations, larger application settings, and more flexible CI/CD workflows.&lt;/p&gt;
&lt;p&gt;For more details, refer to the &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/limits-and-pricing/#definitions&quot;&gt;build limits documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Better local deployment flow for Cloudflare Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-11-21-wrangler-deploy-remote-config-management/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-21-wrangler-deploy-remote-config-management/</guid><description>
&lt;p&gt;Until now, if a Worker had been previously deployed via the &lt;a href=&quot;https://dash.cloudflare.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, a subsequent deployment done via the Cloudflare Workers CLI, &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;&lt;strong&gt;Wrangler&lt;/strong&gt;&lt;/a&gt;
(through the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#deploy&quot;&gt;&lt;code&gt;deploy&lt;/code&gt; command&lt;/a&gt;), would allow the user to override the Worker&apos;s dashboard settings without providing details on
what dashboard settings would be lost.&lt;/p&gt;
&lt;p&gt;Now instead, &lt;code&gt;wrangler deploy&lt;/code&gt; presents a helpful representation of the differences between the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/&quot;&gt;local configuration&lt;/a&gt;
and the remote dashboard settings, and offers to update your local configuration file for you.&lt;/p&gt;
&lt;p&gt;See example below showing a before and after for &lt;code&gt;wrangler deploy&lt;/code&gt; when a local configuration is expected to override a Worker&apos;s dashboard settings:&lt;/p&gt;
&lt;article class=&quot;bg-card ring-border my-4 rounded-lg p-5 shadow-sm ring&quot;&gt;&lt;h3 class=&quot;text-foreground m-0 mb-1.5 text-base leading-snug font-semibold&quot;&gt;Before&lt;/h3&gt;&lt;div class=&quot;text-sm leading-normal text-muted-foreground&quot;&gt;&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=785,height=257,format=webp/_astro/before.Bz-MOePT.png&quot; alt=&quot;wrangler deploy run before the improved workflow&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;785&quot; height=&quot;257&quot;&gt;&lt;/div&gt;&lt;/article&gt;&lt;article class=&quot;bg-card ring-border my-4 rounded-lg p-5 shadow-sm ring&quot;&gt;&lt;h3 class=&quot;text-foreground m-0 mb-1.5 text-base leading-snug font-semibold&quot;&gt;After&lt;/h3&gt;&lt;div class=&quot;text-sm leading-normal text-muted-foreground&quot;&gt;&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=788,height=492,format=webp/_astro/after.BrkkBaRL.png&quot; alt=&quot;wrangler deploy run after the improved workflow&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;788&quot; height=&quot;492&quot;&gt;&lt;/div&gt;&lt;/article&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Update to &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt; v4.50.0 or greater to take advantage of this improved deploy flow.&lt;/p&gt;</description><pubDate>Fri, 21 Nov 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare Fundamentals, Terraform - Terraform v5.13.0 now available</title><link>https://developers.cloudflare.com/changelog/post/2025-11-20-terraform-v5.13.0-provider/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-20-terraform-v5.13.0-provider/</guid><description>&lt;p&gt;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 &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/5774&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2-3 week cadence&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to ensure its stability and reliability, including the v5.13 release. We have also pivoted from an &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;issue-to-issue approach to a resource-per-resource approach&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; - 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.&lt;/p&gt;
&lt;p&gt;Thank you for continuing to raise issues. They make our provider stronger and help us build products that reflect your needs.&lt;/p&gt;
&lt;p&gt;This release includes new features, new resources and data sources, bug fixes, updates to our Developer Documentation, and more.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;breaking-change&quot;&gt;Breaking Change&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#breaking-change&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Please be aware that there are breaking changes for the &lt;code&gt;cloudflare_api_token&lt;/code&gt; and &lt;code&gt;cloudflare_account_token&lt;/code&gt; resources. These changes eliminate configuration drift caused by policy ordering differences in the Cloudflare API.&lt;/p&gt;
&lt;p&gt;For more specific information about the changes or the actions required, please see the &lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/releases/tag/v5.13.0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;detailed Repository changelog&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;features&quot;&gt;Features&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#features&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New resources and data sources added&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;cloudflare_connectivity_directory&lt;/li&gt;
&lt;li&gt;cloudflare_sso_connector&lt;/li&gt;
&lt;li&gt;cloudflare_universal_ssl_setting&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;api_token+account_tokens:&lt;/strong&gt; state upgrader and schema bump (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6472&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6472&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;docs:&lt;/strong&gt; make docs explicit when a resource does not have import support&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;magic_transit_connector:&lt;/strong&gt; support self-serve license key (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6398&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6398&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;worker_version:&lt;/strong&gt; add content_base64 support&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;worker_version:&lt;/strong&gt; boolean support for run_worker_first (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6407&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6407&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_script_subdomains:&lt;/strong&gt; add import support  (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6375&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6375&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_access_application:&lt;/strong&gt; add proxy_endpoint for ZT Access Application (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6453&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6453&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_dlp_predefined_profile:&lt;/strong&gt; Switch DLP Predefined Profile endpoints, introduce enabled_entries attribute&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;bug-fixes&quot;&gt;Bug Fixes&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#bug-fixes&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;account_token:&lt;/strong&gt; token policy order and nested resources (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6440&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6440&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;allow r2_bucket_event_notification to be applied twice without failing (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6419&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6419&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cloudflare_worker+cloudflare_worker_version:&lt;/strong&gt; import for the resources (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6357&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6357&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dns_record:&lt;/strong&gt; inconsistent apply error (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6452&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6452&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pages_domain:&lt;/strong&gt; resource tests (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6338&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6338&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pages_project:&lt;/strong&gt; unintended resource state drift (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6377&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6377&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;queue_consumer:&lt;/strong&gt; id population (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6181&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6181&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_kv:&lt;/strong&gt; multipart request  (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6367&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6367&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_kv:&lt;/strong&gt; updating workers metadata attribute to be read from endpoint (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6386&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6386&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_script_subdomain:&lt;/strong&gt; add note to cloudflare_workers_script_subdomain about redundancy with cloudflare_worker (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6383&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6383&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;workers_script:&lt;/strong&gt; allow config.run_worker_first to accept list input&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_device_custom_profile_local_domain_fallback:&lt;/strong&gt; drift issues (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6365&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6365&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_device_custom_profile:&lt;/strong&gt; resolve drift issues (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6364&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6364&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_dex_test:&lt;/strong&gt; correct configurability for &apos;targeted&apos; attribute to fix drift&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zero_trust_tunnel_cloudflared_config:&lt;/strong&gt; remove warp_routing from cloudflared_config (&lt;a href=&quot;https://github.com/cloudflare/terraform-provider-cloudflare/issues/6471&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#6471&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;upgrading&quot;&gt;Upgrading&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#upgrading&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;for-more-info&quot;&gt;For more info&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#for-more-info&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Terraform Provider&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/terraform/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Documentation on using Terraform with Cloudflare&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 20 Nov 2025 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>Terraform</category></item><item><title>AI Search - AI Search support for crawling login protected website content</title><link>https://developers.cloudflare.com/changelog/post/2025-11-19-add-extra-headers-for-website-crawling/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-19-add-extra-headers-for-website-crawling/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now supports &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/website/authentication-headers/&quot;&gt;custom HTTP headers&lt;/a&gt; for website crawling, solving a common problem where valuable content behind authentication or access controls could not be indexed.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;This is particularly useful for indexing content like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Internal documentation&lt;/strong&gt; behind corporate login systems&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Premium content&lt;/strong&gt; that requires users to provide access to unlock&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sites protected by Cloudflare Access&lt;/strong&gt; using service tokens&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To add custom headers when creating an AI Search instance, select &lt;strong&gt;Parse options&lt;/strong&gt;. In the &lt;strong&gt;Extra headers&lt;/strong&gt; section, you can add up to five custom headers per Website data source.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1098,height=287,format=webp/_astro/ai-search-extra-headers.B7A2spby.png&quot; alt=&quot;Custom headers configuration in AI Search&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1098&quot; height=&quot;287&quot;&gt;
&lt;p&gt;For example, to crawl a site protected by &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/&quot;&gt;Cloudflare Access&lt;/a&gt;, you can add service token credentials as custom headers:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;plaintext&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot; data-nb-lang=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;CF-Access-Client-Id: your-token-id.access&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;CF-Access-Client-Secret: your-token-secret&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;The crawler will automatically include these headers in all requests, allowing it to access protected pages that would otherwise be blocked.&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/data-source/website/authentication-headers/&quot;&gt;configuring custom headers for website crawling&lt;/a&gt; in AI Search.&lt;/p&gt;</description><pubDate>Wed, 19 Nov 2025 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Email security - Adjustment to Final Disposition Column</title><link>https://developers.cloudflare.com/changelog/post/2025-11-18-temporary-adjustment-to-final-disposition-column/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-18-temporary-adjustment-to-final-disposition-column/</guid><description>&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;adjustment-to-final-disposition-column&quot;&gt;Adjustment to Final Disposition column&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#adjustment-to-final-disposition-column&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;the-final-disposition-column-in-submissions--team-submissions-tab-is-changing-for-non-phishguard-customers&quot;&gt;The &lt;strong&gt;Final Disposition&lt;/strong&gt; column in &lt;strong&gt;Submissions&lt;/strong&gt; &amp;gt; &lt;strong&gt;Team Submissions&lt;/strong&gt; tab is changing for non-Phishguard customers.&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#the-final-disposition-column-in-submissions--team-submissions-tab-is-changing-for-non-phishguard-customers&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-changing&quot;&gt;What&apos;s Changing&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-changing&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Column will be called &lt;strong&gt;Status&lt;/strong&gt; instead of &lt;strong&gt;Final Disposition&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Column status values will now be: &lt;strong&gt;Submitted&lt;/strong&gt;, &lt;strong&gt;Accepted&lt;/strong&gt; or &lt;strong&gt;Rejected&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;next-steps&quot;&gt;Next Steps&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#next-steps&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;</description><pubDate>Tue, 18 Nov 2025 00:00:00 GMT</pubDate><product>Email security</product><category>Email security</category></item><item><title>Cloudflare One - New Cloudflare One Navigation and Product Experience</title><link>https://developers.cloudflare.com/changelog/post/new-cloudflare-one-navigation-and-product-experience/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/new-cloudflare-one-navigation-and-product-experience/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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 &amp;gt; Get Started.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1388,height=1546,format=webp/_astro/cf1-dash-changes.Uk_Y-2V-.png&quot; alt=&quot;Cloudflare One Dash Changes&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1388&quot; height=&quot;1546&quot;&gt;
&lt;p&gt;Notable changes&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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&apos; and CASB findings under ‘Cloud &amp;amp; SaaS findings.&apos;&lt;/li&gt;
&lt;li&gt;You can view all analytics, logs, and real-time monitoring tools from ‘Insights.&apos;&lt;/li&gt;
&lt;li&gt;‘Networks&apos; 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 &amp;gt; Connectors.&lt;/li&gt;
&lt;li&gt;Settings are now located closer to the tools and resources they impact. For example, this means you&apos;ll find your WARP configurations at Team &amp;amp; Resources &amp;gt; Devices.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=514,height=1112,format=webp/_astro/new-cf1-navigation.B7-E-9CV.png&quot; alt=&quot;New Cloudflare One Navigation&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;514&quot; height=&quot;1112&quot;&gt;
&lt;p&gt;No changes to our API endpoint structure or to any backend services have been made as part of this effort.&lt;/p&gt;</description><pubDate>Mon, 17 Nov 2025 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category></item><item><title>WAF - WAF Release - 2025-11-17</title><link>https://developers.cloudflare.com/changelog/post/2025-11-17-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-17-waf-release/</guid><description>
&lt;p&gt;This week highlights enhancements to detection signatures improving coverage for vulnerabilities in DELMIA Apriso, linked to CVE-2025-6205.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DELMIA Apriso (CVE-2025-6205): Exploitation could allow an unauthenticated remote attacker to bypass security checks by sending specially crafted requests to the application&apos;s message processor. This enables the creation of arbitrary employee accounts, which can be leveraged to modify system configurations and achieve full system compromise.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ec1e2aa190e64e7cb468e16dd256f4bc&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d256f4bc&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;DELMIA Apriso - Auth Bypass - CVE:CVE-2025-6205&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;fae6fa37ae9249d58628e54b1a3e521e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1a3e521e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;PHP Wrapper Injection - Body&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;Rule metadata description refined. Detection unchanged.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;9c02e585db34440da620eb668f76bd74&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8f76bd74&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;PHP Wrapper Injection - URI&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;Rule metadata description refined. Detection unchanged.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 17 Nov 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Access - Generate Cloudflare Access SSH certificate authority (CA) directly from the Cloudflare dashboard</title><link>https://developers.cloudflare.com/changelog/post/2025-11-14-SSH-CA-enhancements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-14-SSH-CA-enhancements/</guid><description>&lt;p&gt;SSH with &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/ssh/ssh-infrastructure-access/&quot;&gt;Cloudflare Access for Infrastructure&lt;/a&gt; allows you to use short-lived SSH certificates to eliminate SSH key management and reduce security risks associated with lost or stolen keys.&lt;/p&gt;
&lt;p&gt;Previously, users had to generate this certificate by using the &lt;a href=&quot;https://developers.cloudflare.com/api/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare API&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; directly. With this update, you can now create and manage this certificate in the &lt;a href=&quot;https://one.dash.cloudflare.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare One dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; from the &lt;strong&gt;Access controls&lt;/strong&gt; &amp;gt; &lt;strong&gt;Service credentials&lt;/strong&gt; page.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2710,height=1180,format=webp/_astro/SSH-CA-generation.DYa9RnX1.png&quot; alt=&quot;Navigate to Access controls and then Service credentials to see where you can generate an SSH CA&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2710&quot; height=&quot;1180&quot;&gt;
&lt;p&gt;For more details, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/ssh/ssh-infrastructure-access/#generate-a-cloudflare-ssh-ca&quot;&gt;Generate a Cloudflare SSH CA&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>CASB - New SaaS Security weekly digests with API CASB</title><link>https://developers.cloudflare.com/changelog/post/2025-11-14-casb-digest/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-14-casb-digest/</guid><description>&lt;p&gt;You can now stay on top of your SaaS security posture with the new &lt;strong&gt;CASB Weekly Digest&lt;/strong&gt; notification. This opt-in email digest is delivered to your inbox every Monday morning and provides a high-level summary of your organization&apos;s Cloudflare API CASB findings from the previous week.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To opt in, navigate to &lt;strong&gt;Manage Account&lt;/strong&gt; &amp;gt; &lt;strong&gt;Notifications&lt;/strong&gt; in the Cloudflare dashboard to configure the &lt;strong&gt;CASB Weekly Digest&lt;/strong&gt; alert type.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;key-capabilities&quot;&gt;Key capabilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#key-capabilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;At-a-glance summary&lt;/strong&gt; — Review new high/critical findings, most frequent finding types, and new content exposures from the past 7 days.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integration health&lt;/strong&gt; — Instantly see the status of all your connected SaaS integrations (Healthy, Unhealthy, or Paused) to spot API connection issues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proactive alerting&lt;/strong&gt; — The digest is sent automatically to all subscribed users every Monday morning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Easy to configure&lt;/strong&gt; — Users can opt in by enabling the notification in the Cloudflare dashboard under &lt;strong&gt;Manage Account&lt;/strong&gt; &amp;gt; &lt;strong&gt;Notifications&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;learn-more&quot;&gt;Learn more&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#learn-more&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Configure &lt;a href=&quot;https://developers.cloudflare.com/notifications/&quot;&gt;notification preferences&lt;/a&gt; in Cloudflare.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The CASB Weekly Digest notification is available to all Cloudflare users today.&lt;/p&gt;</description><pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate><product>CASB</product><category>CASB</category></item><item><title>Log Explorer - Fixed custom SQL date picker inconsistencies</title><link>https://developers.cloudflare.com/changelog/post/2025-11-13-fixed-custom-date/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-13-fixed-custom-date/</guid><description>&lt;p&gt;We&apos;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</description><pubDate>Thu, 13 Nov 2025 00:00:00 GMT</pubDate><product>Log Explorer</product><category>Log Explorer</category></item><item><title>Log Explorer - Log Explorer adds 14 new datasets</title><link>https://developers.cloudflare.com/changelog/post/2025-11-13-new-datasets/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-13-new-datasets/</guid><description>&lt;p&gt;We&apos;ve significantly enhanced Log Explorer by adding support for 14 additional Cloudflare product datasets.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The newly supported datasets include:&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;zone-level&quot;&gt;Zone Level&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#zone-level&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Dns_logs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Nel_reports&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Page_shield_events&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Spectrum_events&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Zaraz_events&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;account-level&quot;&gt;Account Level&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#account-level&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Audit Logs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Audit_logs_v2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Biso_user_actions&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DNS firewall logs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Email_security_alerts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Magic Firewall IDS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Network Analytics&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Sinkhole HTTP&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ipsec_logs&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;&lt;code&gt;Auditlog&lt;/code&gt; and &lt;code&gt;Auditlog_v2&lt;/code&gt; datasets require &lt;code&gt;audit-log.read&lt;/code&gt; permission for querying.&lt;/p&gt;&lt;p&gt;The &lt;code&gt;biso_user_actions&lt;/code&gt; dataset requires either the &lt;code&gt;Super Admin&lt;/code&gt; or &lt;code&gt;ZT PII&lt;/code&gt; role for querying.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-correlating-logs&quot;&gt;Example: Correlating logs&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-correlating-logs&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;code&gt;FW_event&lt;/code&gt; logs, and then instantly pivot to the &lt;code&gt;Network Analytics&lt;/code&gt; logs or &lt;code&gt;Access&lt;/code&gt; logs to see its network-level traffic profile or if it bypassed a corporate policy.&lt;/p&gt;
&lt;p&gt;To learn more and get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/log-explorer/&quot;&gt;Log Explorer documentation&lt;/a&gt; and the &lt;a href=&quot;https://developers.cloudflare.com/logs/&quot;&gt;Cloudflare Logs documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 13 Nov 2025 00:00:00 GMT</pubDate><product>Log Explorer</product><category>Log Explorer</category></item><item><title>API Shield - New BOLA Vulnerability Detection for API Shield</title><link>https://developers.cloudflare.com/changelog/post/2025-11-12-bola-attack-detection/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-12-bola-attack-detection/</guid><description>&lt;p&gt;Now, API Shield automatically searches for and highlights &lt;strong&gt;Broken Object Level Authorization (BOLA) attacks&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;On the Security Overview card, select the suggestion &amp;gt; &lt;strong&gt;View details&lt;/strong&gt; to review the top attacked API endpoints, endpoint details, and the attack summary:
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1546,height=816,format=webp/_astro/bola-overview-card.hwcSeAkb.png&quot; alt=&quot;BOLA attack Overview card&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1546&quot; height=&quot;816&quot;&gt;&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1246,height=1078,format=webp/_astro/bola-overview-drawer.DD2c0bxS.png&quot; alt=&quot;BOLA attack Overview drawer&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1246&quot; height=&quot;1078&quot;&gt;&lt;/p&gt;
&lt;p&gt;From the endpoint details, you can select &lt;strong&gt;View attack&lt;/strong&gt; to find details about the BOLA attacker’s sessions.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2050,height=630,format=webp/_astro/bola-endpoint-attack.UQP3MDkp.png&quot; alt=&quot;BOLA attack endpoint details&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2050&quot; height=&quot;630&quot;&gt;
&lt;p&gt;From here, select &lt;strong&gt;View in Analytics&lt;/strong&gt; to observe attacker traffic over time for the last seven days.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1156,height=1176,format=webp/_astro/bola-analytics-drawer.DXzC6EJU.png&quot; alt=&quot;BOLA attack analytics drawer&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1156&quot; height=&quot;1176&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;At any time, you can also start your investigation into attack traffic from Security Analytics by selecting the suspicious activity card.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1252,height=722,format=webp/_astro/bola-suspicious-card._B3GB3s4.png&quot; alt=&quot;Suspicious Activity card&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1252&quot; height=&quot;722&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</description><pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate><product>API Shield</product><category>API Shield</category></item><item><title>Digital Experience Monitoring - DEX Logpush jobs</title><link>https://developers.cloudflare.com/changelog/post/2025-11-12-dex-logpush-jobs/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-12-dex-logpush-jobs/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/dex/&quot;&gt;Digital Experience Monitoring (DEX)&lt;/a&gt; provides visibility into WARP device metrics, connectivity, and network performance across your Cloudflare SASE deployment.&lt;/p&gt;
&lt;p&gt;We&apos;ve released four new WARP and DEX device data sets that can be exported via &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/insights/logs/logpush/&quot;&gt;Cloudflare Logpush&lt;/a&gt;. These Logpush data sets can be exported to R2, a cloud bucket, or a SIEM to build a customized logging and analytics experience.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/dex_application_tests/&quot;&gt;DEX Application Tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/dex_device_state_events/&quot;&gt;DEX Device State Events&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/warp_config_changes/&quot;&gt;WARP Config Changes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/warp_toggle_changes/&quot;&gt;WARP Toggle Changes&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To create a new DEX or WARP Logpush job, customers can go to the account level of the Cloudflare dashboard &amp;gt; Analytics &amp;amp; Logs &amp;gt; Logpush to get started.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2549,height=1283,format=webp/_astro/dex_logpush_datasets.CtCk36pX.png&quot; alt=&quot;DEX logpush job creation dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2549&quot; height=&quot;1283&quot;&gt;</description><pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate><product>Digital Experience Monitoring</product><category>Digital Experience Monitoring</category></item><item><title>Workers Analytics Engine, Workers - More SQL aggregate, date and time functions available in Workers Analytics Engine</title><link>https://developers.cloudflare.com/changelog/post/2025-11-12-analytics-engine-further-sql-enhancements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-12-analytics-engine-further-sql-enhancements/</guid><description>&lt;p&gt;You can now perform more powerful queries directly in &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Workers Analytics Engine&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; with a major expansion of our SQL function library.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Today, we&apos;ve expanded Workers Analytics Engine&apos;s SQL capabilities with several new functions:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/aggregate-functions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;New aggregate functions:&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;countIf()&lt;/code&gt; - count the number of rows which satisfy a provided condition&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sumIf()&lt;/code&gt; - calculate a sum from rows which satisfy a provided condition&lt;/li&gt;
&lt;li&gt;&lt;code&gt;avgIf()&lt;/code&gt; - calculate an average from rows which satisfy a provided condition&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/date-time-functions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;New date and time functions:&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;toYear()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toMonth()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toDayOfMonth()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toDayOfWeek()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toHour()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toMinute()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toSecond()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfYear()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfMonth()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfWeek()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfDay()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfHour()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfFifteenMinutes()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfTenMinutes()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfFiveMinutes()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toStartOfMinute()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;today()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toYYYYMM()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ready-to-get-started&quot;&gt;Ready to get started?&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ready-to-get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Whether you&apos;re building usage-based billing systems, customer analytics dashboards, or other custom analytics, these functions let you get the most out of your data. &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/get-started/&quot;&gt;Get started &lt;/a&gt; with Workers Analytics Engine and explore all available functions in our &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/&quot;&gt;SQL reference documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 12 Nov 2025 00:00:00 GMT</pubDate><product>Workers Analytics Engine</product><category>Workers Analytics Engine</category><category>Workers</category></item><item><title>Cloudflare One Client - WARP client for Windows (version 2025.9.558.0)</title><link>https://developers.cloudflare.com/changelog/post/2025-11-11-warp-windows-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-11-warp-windows-ga/</guid><description>&lt;p&gt;A new GA release for the Windows WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes, improvements, and new features including &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/path-mtu-discovery/#enable-path-mtu-discovery&quot;&gt;Path Maximum Transmission Unit Discovery (PMTUD)&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed an inconsistency with &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#disconnect-warp-on-all-devices&quot;&gt;Global WARP override&lt;/a&gt; settings in multi-user environments when switching between users.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Fixed an issue where deleting a registration was erroneously reported as having failed.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/path-mtu-discovery/#enable-path-mtu-discovery&quot;&gt;PMTUD documentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Improvements for the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/warp-client-checks/os-version/&quot;&gt;OS version&lt;/a&gt; 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.&lt;/li&gt;
&lt;li&gt;The WARP client now supports Windows 11 ARM-based machines. For information on known limitations, refer to the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/troubleshooting/known-limitations/#cloudflare-one-client-disconnected-on-windows-arm&quot;&gt;Known limitations page&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd&quot;&gt;Windows 11 24H2 KB5062553&lt;/a&gt; or higher for resolution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server&quot;&gt;Route traffic to fallback server&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Devices with KB5055523 installed may receive a warning about &lt;code&gt;Win32/ClickFix.ABA&lt;/code&gt; being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to &lt;a href=&quot;https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0&quot;&gt;version 1.429.19.0&lt;/a&gt; or later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS resolution may be broken when the following conditions are all true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.&lt;/li&gt;
&lt;li&gt;A custom DNS server address is configured on the primary network adapter.&lt;/li&gt;
&lt;li&gt;The custom DNS server address on the primary network adapter is changed while WARP is connected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To work around this issue, reconnect the WARP client by toggling off and back on.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 11 Nov 2025 17:28:35 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - WARP client for macOS (version 2025.9.558.0)</title><link>https://developers.cloudflare.com/changelog/post/2025-11-11-warp-macos-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-11-warp-macos-ga/</guid><description>&lt;p&gt;A new GA release for the macOS WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes, improvements, and new features including &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/path-mtu-discovery/#enable-path-mtu-discovery&quot;&gt;Path Maximum Transmission Unit Discovery (PMTUD)&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Fixed an issue where deleting a registration was erroneously reported as having failed.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/path-mtu-discovery/#enable-path-mtu-discovery&quot;&gt;PMTUD documentation&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server&quot;&gt;Route traffic to fallback server&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 11 Nov 2025 17:28:35 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - WARP client for Linux (version 2025.9.558.0)</title><link>https://developers.cloudflare.com/changelog/post/2025-11-11-warp-linux-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-11-warp-linux-ga/</guid><description>&lt;p&gt;A new GA release for the Linux WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes, improvements, and new features including &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/path-mtu-discovery/#enable-path-mtu-discovery&quot;&gt;Path Maximum Transmission Unit Discovery (PMTUD)&lt;/a&gt;. 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.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://pkg.cloudflareclient.com/&quot;&gt;pkg.cloudflareclient.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Fixed an issue where deleting a registration was erroneously reported as having failed.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/path-mtu-discovery/#enable-path-mtu-discovery&quot;&gt;PMTUD documentation&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 11 Nov 2025 15:06:09 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Log Explorer - Resize your custom SQL window in Log Explorer</title><link>https://developers.cloudflare.com/changelog/post/2025-11-11-resize-sql-window/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-11-resize-sql-window/</guid><description>&lt;p&gt;We&apos;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To learn more and get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/log-explorer/&quot;&gt;Log Explorer documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate><product>Log Explorer</product><category>Log Explorer</category></item><item><title>Logs - Logpush Health Dashboards</title><link>https://developers.cloudflare.com/changelog/post/2025-11-11-health-dashboards/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-11-health-dashboards/</guid><description>&lt;p&gt;We’re excited to introduce &lt;strong&gt;Logpush Health Dashboards&lt;/strong&gt;, giving customers real-time visibility into the status, reliability, and performance of their &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/&quot;&gt;Logpush&lt;/a&gt; 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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Upload Health&lt;/strong&gt;: 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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Upload Reliability&lt;/strong&gt; – Diagnose issues impacting stability, retries, or latency, and monitor key metrics such as retry counts, upload duration, and destination availability.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1333,height=334,format=webp/_astro/Health-Dashboard.CP0mV0IW.gif&quot; alt=&quot;Health Dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1333&quot; height=&quot;334&quot;&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-health&quot;&gt;&lt;strong&gt;Logpush Health Dashboards&lt;/strong&gt;&lt;/a&gt; documentation, which includes a comprehensive troubleshooting guide to help interpret and resolve common issues.&lt;/p&gt;</description><pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>Cloudflare Tunnel, Cloudflare Tunnel for SASE - cloudflared proxy-dns command will be removed starting February 2, 2026</title><link>https://developers.cloudflare.com/changelog/post/2025-11-11-cloudflared-proxy-dns/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-11-cloudflared-proxy-dns/</guid><description>&lt;p&gt;Starting February 2, 2026, the &lt;code&gt;cloudflared proxy-dns&lt;/code&gt; command will be removed from all new &lt;code&gt;cloudflared&lt;/code&gt; &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/&quot;&gt;releases&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This change is being made to enhance security and address a potential vulnerability in an underlying DNS library. This vulnerability is specific to the &lt;code&gt;proxy-dns&lt;/code&gt; command and does not affect any other &lt;code&gt;cloudflared&lt;/code&gt; features, such as the core &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; service.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;proxy-dns&lt;/code&gt; command, which runs a client-side &lt;a href=&quot;https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/&quot;&gt;DNS-over-HTTPS (DoH)&lt;/a&gt; proxy, has been an officially undocumented feature for several years. This functionality is fully and securely supported by our actively developed products.&lt;/p&gt;
&lt;p&gt;Versions of &lt;code&gt;cloudflared&lt;/code&gt; released before this date will not be affected and will continue to operate. However, note that our &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/#deprecated-releases&quot;&gt;official support policy&lt;/a&gt; for any &lt;code&gt;cloudflared&lt;/code&gt; release is one year from its release date.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;migration-paths&quot;&gt;Migration paths&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#migration-paths&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/1.1.1.1/encryption/dns-over-https/&quot;&gt;DNS-over-HTTPS&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;end-user-devices&quot;&gt;End-user devices&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#end-user-devices&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The preferred method for enabling DNS-over-HTTPS on user devices is the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/&quot;&gt;Cloudflare WARP client&lt;/a&gt;. The WARP client automatically secures and proxies all DNS traffic from your device, integrating it with your organization&apos;s &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot;&gt;Zero Trust policies&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/reusable-components/posture-checks/&quot;&gt;posture checks&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;servers-routers-and-iot-devices&quot;&gt;Servers, routers, and IoT devices&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#servers-routers-and-iot-devices&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;For scenarios where installing a client on every device is not possible (such as servers, routers, or IoT devices), we recommend using the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;WARP Connector&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Instead of running &lt;code&gt;cloudflared proxy-dns&lt;/code&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/&quot;&gt;entire subnet&lt;/a&gt; to Cloudflare for &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/&quot;&gt;filtering and logging&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate><product>Cloudflare Tunnel</product><category>Cloudflare Tunnel</category><category>Cloudflare Tunnel for SASE</category></item><item><title>AI Crawl Control - Crawler drilldowns with extended actions menu</title><link>https://developers.cloudflare.com/changelog/post/2025-11-10-ai-crawl-control-crawler-info/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-10-ai-crawl-control-crawler-info/</guid><description>&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/waf/custom-rules/&quot;&gt;WAF custom rules&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/rules/url-forwarding/&quot;&gt;Redirect Rules&lt;/a&gt;, and robots.txt files.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;status-code-distribution-chart&quot;&gt;Status code distribution chart&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#status-code-distribution-chart&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;strong&gt;Metrics&lt;/strong&gt; 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1712,height=1104,format=webp/_astro/ai-crawl-control-status-codes.DESJcAiK.png&quot; alt=&quot;AI Crawl Control status code distribution chart&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1712&quot; height=&quot;1104&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;extended-actions-menu&quot;&gt;Extended actions menu&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#extended-actions-menu&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Each crawler row includes a three-dot menu with per-crawler actions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;View Metrics&lt;/strong&gt; — Filter the AI Crawl Control Metrics page to the selected crawler.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;View on Cloudflare Radar&lt;/strong&gt; — Access verified crawler details on Cloudflare Radar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copy User Agent&lt;/strong&gt; — Copy user agent strings for use in WAF custom rules, Redirect Rules, or robots.txt files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;View in Security Analytics&lt;/strong&gt; — Filter Security Analytics by detection IDs (Bot Management customers).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copy Detection ID&lt;/strong&gt; — Copy detection IDs for use in WAF custom rules (Bot Management customers).&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2040,height=762,format=webp/_astro/ai-crawl-control-crawler-info.Dwc39LqI.png&quot; alt=&quot;AI Crawl Control crawler actions menu&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2040&quot; height=&quot;762&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Log in to the Cloudflare dashboard, and select your account and domain.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;AI Crawl Control&lt;/strong&gt; &amp;gt; &lt;strong&gt;Metrics&lt;/strong&gt; to access the status code distribution chart.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;AI Crawl Control&lt;/strong&gt; &amp;gt; &lt;strong&gt;Crawlers&lt;/strong&gt; and select the three-dot menu for any crawler to access per-crawler actions.&lt;/li&gt;
&lt;li&gt;Select multiple crawlers to use bulk copy buttons for user agents or detection IDs.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/&quot;&gt;AI Crawl Control&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 10 Nov 2025 00:00:00 GMT</pubDate><product>AI Crawl Control</product><category>AI Crawl Control</category></item><item><title>WAF - WAF Release - 2025-11-10</title><link>https://developers.cloudflare.com/changelog/post/2025-11-10-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-10-waf-release/</guid><description>
&lt;p&gt;This week’s release introduces new detections for Prototype Pollution across three common vectors: URI, Body, and Header/Form.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;These attacks can affect both API and web applications by altering normal behavior or bypassing security controls.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;32405a50728746dd8caa057b606285e6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...606285e6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Prototype Pollution - URI&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;a7da00c63c4243d2a72456fe4f59ff26&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...4f59ff26&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Prototype Pollution - Body&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;833078bdcfa04bb7aa7b8fb67efbeb39&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...7efbeb39&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Prototype Pollution - Header - Form&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a new detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 10 Nov 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - Select Wrangler environments using the CLOUDFLARE_ENV environment variable</title><link>https://developers.cloudflare.com/changelog/post/2025-11-09-cloudflare-env-variable/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-09-cloudflare-env-variable/</guid><description>&lt;p&gt;Wrangler now supports using the &lt;code&gt;CLOUDFLARE_ENV&lt;/code&gt; &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/system-environment-variables/#supported-environment-variables&quot;&gt;environment variable&lt;/a&gt; to select the active &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/environments/&quot;&gt;environment&lt;/a&gt; for your Worker commands. This provides a more flexible way to manage environments, especially when working with build tools and CI/CD pipelines.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Environment selection via environment variable:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set &lt;code&gt;CLOUDFLARE_ENV&lt;/code&gt; to specify which environment to use for Wrangler commands&lt;/li&gt;
&lt;li&gt;Works with all Wrangler commands that support the &lt;code&gt;--env&lt;/code&gt; flag&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;--env&lt;/code&gt; command line argument takes precedence over the &lt;code&gt;CLOUDFLARE_ENV&lt;/code&gt; environment variable&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-usage&quot;&gt;Example usage&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-usage&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Deploy to the production environment using CLOUDFLARE_ENV&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;CLOUDFLARE_ENV&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;production&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Upload a version to the staging environment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;CLOUDFLARE_ENV&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;staging&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; versions&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; upload&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# The --env flag takes precedence over CLOUDFLARE_ENV&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;CLOUDFLARE_ENV&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --env&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; production&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# This will deploy to production, not dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;use-with-build-tools&quot;&gt;Use with build tools&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#use-with-build-tools&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;CLOUDFLARE_ENV&lt;/code&gt; 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:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Set the environment for both build and deploy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;CLOUDFLARE_ENV&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;production&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; npm&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; build&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; &amp;amp; &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;When using &lt;code&gt;@cloudflare/vite-plugin&lt;/code&gt;, the build process generates a &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/#generated-wrangler-configuration&quot;&gt;&quot;redirected deploy config&quot;&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;learn-more&quot;&gt;Learn more&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#learn-more&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/system-environment-variables/&quot;&gt;System environment variables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/environments/&quot;&gt;Environments&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Sun, 09 Nov 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cache - Inspect Cache Keys with Cloudflare Trace</title><link>https://developers.cloudflare.com/changelog/post/2025-11-07-cache-keys-for-cloudflare-trace/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-07-cache-keys-for-cloudflare-trace/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Access Trace via the &lt;a href=&quot;https://developers.cloudflare.com/rules/trace-request/how-to/#use-trace-in-the-dashboard&quot;&gt;dashboard&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/api/resources/request_tracer/methods/trace/&quot;&gt;API&lt;/a&gt;, either manually for ad-hoc debugging or automated as part of your quality-of-service monitoring.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-scenario&quot;&gt;Example scenario&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-scenario&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;If you have a Cache Rule that segments content based on a specific cookie (for example, &lt;code&gt;user_region&lt;/code&gt;), run a Trace with that cookie present to confirm the &lt;code&gt;user_region&lt;/code&gt; value appears in the resulting cache key.&lt;/p&gt;
&lt;p&gt;The Trace response includes the cache key in the &lt;code&gt;cache&lt;/code&gt; object:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;step_name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;request&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cache&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;matched&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;public_name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Cache Parameters&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;cache&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;key&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;zone_id&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;023e105f4ecef8ad9ca31a8372d0c353&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;scheme&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;host&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;      &quot;uri&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;/images/hero.jpg&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    &quot;key_string&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;023e105f4ecef8ad9ca31a8372d0c353::::https://example.com/images/hero.jpg:::::&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To learn more, refer to the &lt;a href=&quot;https://developers.cloudflare.com/rules/trace-request/&quot;&gt;Trace documentation&lt;/a&gt; and our guide on &lt;a href=&quot;https://developers.cloudflare.com/cache/how-to/cache-keys/&quot;&gt;Custom Cache Keys&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 07 Nov 2025 00:00:00 GMT</pubDate><product>Cache</product><category>Cache</category></item><item><title>Workers - Workers automatic tracing, now in open beta</title><link>https://developers.cloudflare.com/changelog/post/2025-11-07-automatic-tracing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-07-automatic-tracing/</guid><description>
&lt;p&gt;Enable automatic tracing on your Workers, giving you detailed metadata and timing information for every operation your Worker performs.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1920,height=1080,format=webp/_astro/R2_Screenshot.DAnOidMq.png&quot; alt=&quot;Tracing example&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1920&quot; height=&quot;1080&quot;&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Which calls are slowing down my application?&lt;/li&gt;
&lt;li&gt;Which queries to my database take the longest?&lt;/li&gt;
&lt;li&gt;What happened within a request that resulted in an error?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;You can now:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;View traces alongside your logs in the Workers Observability dashboard&lt;/li&gt;
&lt;li&gt;Export traces (and correlated logs) to any &lt;a href=&quot;https://opentelemetry.io/docs/specs/otel/protocol/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;OTLP-compatible destination&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, such as &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/exporting-opentelemetry-data/honeycomb/&quot;&gt;Honeycomb&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/exporting-opentelemetry-data/sentry/&quot;&gt;Sentry&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/exporting-opentelemetry-data/grafana-cloud/&quot;&gt;Grafana&lt;/a&gt;, by configuring a tracing destination in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages/observability/destinations&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Analyze and query across span attributes (operation type, status, duration, errors)&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;to-get-started-set&quot;&gt;To get started, set:&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#to-get-started-set&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;observability&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;traces&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;enabled&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;In the future, Cloudflare plans to enable automatic tracing in addition to logs
when you set &lt;code&gt;observability.enabled = true&lt;/code&gt; in your Wrangler configuration.&lt;/p&gt;&lt;p&gt;While automatic tracing is in early beta, this setting will not enable tracing by default,
and will only enable logs.&lt;/p&gt;&lt;p&gt;An updated &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/compatibility-dates/&quot;&gt;&lt;code&gt;compatibility_date&lt;/code&gt;&lt;/a&gt; will be required for this change to take effect.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;want-to-learn-more&quot;&gt;Want to learn more?&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#want-to-learn-more&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.cloudflare.com/workers-tracing-now-in-open-beta/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Read the announcement&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/observability/traces/&quot;&gt;Check out the documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 07 Nov 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare One, Cloudflare WAN - Automatic Return Routing (Beta)</title><link>https://developers.cloudflare.com/changelog/post/2025-11-06-automatic-return-routing-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-06-automatic-return-routing-beta/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Key benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Route-less mode&lt;/strong&gt;: Static or dynamic routes are optional when using ARR.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Overlapping IP space support&lt;/strong&gt;: Traffic originating from customer sites can use overlapping private IP ranges.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Symmetric routing&lt;/strong&gt;: Return traffic is guaranteed to use the same connection as the original on-ramp.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This feature is currently in beta and requires the new Unified Routing mode (beta).&lt;/p&gt;
&lt;p&gt;For configuration details, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/how-to/configure-routes/#configure-automatic-return-routing-beta&quot;&gt;Configure Automatic Return Routing&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 06 Nov 2025 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category><category>Cloudflare WAN</category></item><item><title>Cloudflare One Appliance, Cloudflare One, Cloudflare WAN - Designate WAN link for breakout traffic</title><link>https://developers.cloudflare.com/changelog/post/2025-11-06-connector-designate-wan-link-breakout/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-06-connector-designate-wan-link-breakout/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;With this feature, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pin breakout traffic for specific applications to a preferred WAN port.&lt;/li&gt;
&lt;li&gt;Ensure critical traffic (such as Zoom or Teams) always uses your fastest or most reliable connection.&lt;/li&gt;
&lt;li&gt;Benefit from automatic failover to standard WAN port priority if the preferred port goes down.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is useful for organizations with multiple ISP uplinks who need predictable egress behavior for performance-sensitive traffic.&lt;/p&gt;
&lt;p&gt;For configuration details, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/appliance/network-options/application-based-policies/breakout-traffic/#designate-wan-ports-for-breakout-apps&quot;&gt;Designate WAN ports for breakout apps&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 06 Nov 2025 00:00:00 GMT</pubDate><product>Cloudflare One Appliance</product><category>Cloudflare One Appliance</category><category>Cloudflare One</category><category>Cloudflare WAN</category></item><item><title>Gateway - Applications to be remapped to the new categories</title><link>https://developers.cloudflare.com/changelog/post/2025-11-06-Applications-recategorised-plan/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-06-Applications-recategorised-plan/</guid><description>&lt;p&gt;We have previously added new application categories to better reflect their content and improve HTTP traffic management: refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/changelog/gateway/#2025-10-28&quot;&gt;Changelog&lt;/a&gt;.
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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Review the new category structure.&lt;/li&gt;
&lt;li&gt;Identify any policies you have that target the older categories.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Applications being remappedd&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Application Name&lt;/th&gt;
&lt;th&gt;Existing Category&lt;/th&gt;
&lt;th&gt;New Category&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google Photos&lt;/td&gt;
&lt;td&gt;File Sharing&lt;/td&gt;
&lt;td&gt;Photography &amp;amp; Graphic Design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flickr&lt;/td&gt;
&lt;td&gt;File Sharing&lt;/td&gt;
&lt;td&gt;Photography &amp;amp; Graphic Design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADP&lt;/td&gt;
&lt;td&gt;Human Resources&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Greenhouse&lt;/td&gt;
&lt;td&gt;Human Resources&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;myCigna&lt;/td&gt;
&lt;td&gt;Human Resources&lt;/td&gt;
&lt;td&gt;Health &amp;amp; Fitness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UnitedHealthcare&lt;/td&gt;
&lt;td&gt;Human Resources&lt;/td&gt;
&lt;td&gt;Health &amp;amp; Fitness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ZipRecruiter&lt;/td&gt;
&lt;td&gt;Human Resources&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon Business&lt;/td&gt;
&lt;td&gt;Human Resources&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jobcenter&lt;/td&gt;
&lt;td&gt;Human Resources&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jobsuche&lt;/td&gt;
&lt;td&gt;Human Resources&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zenjob&lt;/td&gt;
&lt;td&gt;Human Resources&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DocuSign&lt;/td&gt;
&lt;td&gt;Legal&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postident&lt;/td&gt;
&lt;td&gt;Legal&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adobe Creative Cloud&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Photography &amp;amp; Graphic Design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Airtable&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autodesk Fusion360&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;IT Management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coursera&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Education&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Power BI&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tableau&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duolingo&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Education&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adobe Reader&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AnpiReport&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Travel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ビズリーチ&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;doda (デューダ)&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;求人ボックス&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;マイナビ2026&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Power Apps&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RECRUIT AGENT&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;シフトボード&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;スタンバイ&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Doctolib&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Health &amp;amp; Fitness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Miro&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Photography &amp;amp; Graphic Design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MyFitnessPal&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Health &amp;amp; Fitness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sentry Mobile&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Travel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slido&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Photography &amp;amp; Graphic Design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arista Networks&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;IT Management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Atlassian&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CoderPad&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;eAgreements&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vmware&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;IT Management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vmware Vcenter&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;IT Management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS Skill Builder&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Education&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Office 365 (GCC)&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Exchange Online (GCC)&lt;/td&gt;
&lt;td&gt;Productivity&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canva&lt;/td&gt;
&lt;td&gt;Sales &amp;amp; Marketing&lt;/td&gt;
&lt;td&gt;Photography &amp;amp; Graphic Design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Instacart&lt;/td&gt;
&lt;td&gt;Shopping&lt;/td&gt;
&lt;td&gt;Food &amp;amp; Drink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wawa&lt;/td&gt;
&lt;td&gt;Shopping&lt;/td&gt;
&lt;td&gt;Food &amp;amp; Drink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;McDonald&apos;s&lt;/td&gt;
&lt;td&gt;Shopping&lt;/td&gt;
&lt;td&gt;Food &amp;amp; Drink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vrbo&lt;/td&gt;
&lt;td&gt;Shopping&lt;/td&gt;
&lt;td&gt;Travel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;American Airlines&lt;/td&gt;
&lt;td&gt;Shopping&lt;/td&gt;
&lt;td&gt;Travel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Booking.com&lt;/td&gt;
&lt;td&gt;Shopping&lt;/td&gt;
&lt;td&gt;Travel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ticketmaster&lt;/td&gt;
&lt;td&gt;Shopping&lt;/td&gt;
&lt;td&gt;Entertainment &amp;amp; Events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Airbnb&lt;/td&gt;
&lt;td&gt;Shopping&lt;/td&gt;
&lt;td&gt;Travel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DoorDash&lt;/td&gt;
&lt;td&gt;Shopping&lt;/td&gt;
&lt;td&gt;Food &amp;amp; Drink&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expedia&lt;/td&gt;
&lt;td&gt;Shopping&lt;/td&gt;
&lt;td&gt;Travel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EasyPark&lt;/td&gt;
&lt;td&gt;Shopping&lt;/td&gt;
&lt;td&gt;Travel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UEFA Tickets&lt;/td&gt;
&lt;td&gt;Shopping&lt;/td&gt;
&lt;td&gt;Entertainment &amp;amp; Events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DHL Express&lt;/td&gt;
&lt;td&gt;Shopping&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UPS&lt;/td&gt;
&lt;td&gt;Shopping&lt;/td&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;For more information on creating HTTP policies, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/application-app-types/&quot;&gt;Applications and app types&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 06 Nov 2025 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category></item><item><title>D1, Workers - D1 can restrict data localization with jurisdictions</title><link>https://developers.cloudflare.com/changelog/post/2025-11-05-d1-jurisdiction/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-05-d1-jurisdiction/</guid><description>&lt;p&gt;You can now set a &lt;a href=&quot;https://developers.cloudflare.com/d1/configuration/data-location/&quot;&gt;jurisdiction&lt;/a&gt; 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 &lt;code&gt;eu&lt;/code&gt; and &lt;code&gt;fedramp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler@latest&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; d1&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; db-with-jurisdiction&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --jurisdiction&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; eu&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; POST&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&amp;lt;account_id&amp;gt;/d1/database&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Authorization: Bearer &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$TOKEN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: application/json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;     --data&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;{&quot;name&quot;: &quot;db-with-jurisdiction&quot;, &quot;jurisdiction&quot;: &quot;eu&quot; }&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To learn more, visit D1&apos;s data location &lt;a href=&quot;https://developers.cloudflare.com/d1/configuration/data-location/&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate><product>D1</product><category>D1</category><category>Workers</category></item><item><title>Logs - Logpush Permission Update for Zero Trust Datasets</title><link>https://developers.cloudflare.com/changelog/post/2025-11-05-logpush-permissions-update/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-05-logpush-permissions-update/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/permissions/&quot;&gt;Permissions&lt;/a&gt; for managing Logpush jobs related to &lt;a href=&quot;https://developers.cloudflare.com/logs/logpush/logpush-job/datasets/account/&quot;&gt;Zero Trust datasets&lt;/a&gt; (Access, Gateway, and DEX) have been updated to improve data security and enforce appropriate access controls.&lt;/p&gt;
&lt;p&gt;To view, create, update, or delete Logpush jobs for Zero Trust datasets, users must now have both of the following permissions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Logs Edit&lt;/li&gt;
&lt;li&gt;Zero Trust: PII Read&lt;/li&gt;
&lt;/ul&gt;
&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;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.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;</description><pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>WAF - WAF Release - 2025-11-05 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2025-11-05-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-05-emergency-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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&apos;s patches and restrict Metro’s network exposure to reduce this risk.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;db6b9e1ac1494971ae8c70aac8e30c5b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...c8e30c5b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;React Native Metro - Command Injection - CVE:CVE-2025-11953&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers VPC - Announcing Workers VPC Services (Beta)</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-workers-vpc/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-workers-vpc/</guid><description>&lt;p&gt;&lt;strong&gt;Workers VPC Services&lt;/strong&gt; is now available, enabling your Workers to securely access resources in your private networks, without having to expose them on the public Internet.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VPC Services&lt;/strong&gt;: Create secure connections to internal APIs, databases, and services using familiar Worker binding syntax&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-cloud Support&lt;/strong&gt;: Connect to resources in private networks in any external cloud (AWS, Azure, GCP, etc.) or on-premise using Cloudflare Tunnels&lt;/li&gt;
&lt;/ul&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Perform application logic in Workers here&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Sample call to an internal API running on ECS in AWS using the binding&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AWS_VPC_ECS_API&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://internal-host.example.com&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Additional application logic in Workers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;getting-started&quot;&gt;Getting started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#getting-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Set up a Cloudflare Tunnel, create a VPC Service, add service bindings to your Worker, and access private resources securely. &lt;a href=&quot;https://developers.cloudflare.com/workers-vpc/&quot;&gt;Refer to the documentation&lt;/a&gt; to get started.&lt;/p&gt;</description><pubDate>Wed, 05 Nov 2025 00:00:00 GMT</pubDate><product>Workers VPC</product><category>Workers VPC</category></item><item><title>Log Explorer - Log Explorer now supports query cancellation</title><link>https://developers.cloudflare.com/changelog/post/2025-11-04-query-cancellation/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-04-query-cancellation/</guid><description>&lt;p&gt;We&apos;re excited to announce that Log Explorer users can now cancel queries that are currently running.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</description><pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate><product>Log Explorer</product><category>Log Explorer</category></item><item><title>Log Explorer - Log Explorer now shows query result distribution</title><link>https://developers.cloudflare.com/changelog/post/2025-11-13-query-result-distribution/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-13-query-result-distribution/</guid><description>&lt;p&gt;We&apos;re excited to announce a new feature in Log Explorer that significantly enhances how you analyze query results: the Query results distribution chart.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;The chart will dynamically update to reflect the logs matching your current query.&lt;/p&gt;</description><pubDate>Tue, 04 Nov 2025 00:00:00 GMT</pubDate><product>Log Explorer</product><category>Log Explorer</category></item><item><title>WAF - WAF Release - 2025-11-03</title><link>https://developers.cloudflare.com/changelog/post/2025-11-03-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-03-waf-release/</guid><description>
&lt;p&gt;This week highlights enhancements to detection signatures improving coverage for vulnerabilities in Adobe Commerce and Magento Open Source, linked to CVE-2025-54236.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;f5295d8333b7428c816654d8cb6d5fe5&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...cb6d5fe5&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;100774C&lt;/td&gt;&lt;td&gt;Adobe Commerce - Remote Code Execution - CVE:CVE-2025-54236&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is an improved detection.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - Capture Wrangler command output in structured format</title><link>https://developers.cloudflare.com/changelog/post/2025-11-03-wrangler-output-file/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-11-03-wrangler-output-file/</guid><description>&lt;p&gt;You can now capture Wrangler command output in a structured &lt;a href=&quot;https://github.com/ndjson/ndjson-spec&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ND-JSON&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; format by setting the &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/system-environment-variables/#supported-environment-variables&quot;&gt;&lt;code&gt;WRANGLER_OUTPUT_FILE_PATH&lt;/code&gt;&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/system-environment-variables/#supported-environment-variables&quot;&gt;&lt;code&gt;WRANGLER_OUTPUT_FILE_DIRECTORY&lt;/code&gt;&lt;/a&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/#deploy&quot;&gt;&lt;code&gt;wrangler deploy&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/#versions&quot;&gt;&lt;code&gt;wrangler versions upload&lt;/code&gt;&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/#versions&quot;&gt;&lt;code&gt;wrangler versions deploy&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/#deploy-1&quot;&gt;&lt;code&gt;wrangler pages deploy&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 03 Nov 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Security Center - Report logo misuse to Cloudflare directly from the Brand Protection dashboard</title><link>https://developers.cloudflare.com/changelog/post/2025-10-31-brand-protection-logo-dashboard-report-abuse/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-31-brand-protection-logo-dashboard-report-abuse/</guid><description>&lt;p&gt;The Brand Protection logo query dashboard now allows you to use the &lt;strong&gt;Report to Cloudflare&lt;/strong&gt; 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.&lt;/p&gt;
&lt;p&gt;Ready to start? Check out the &lt;a href=&quot;https://developers.cloudflare.com/security-center/brand-protection/&quot;&gt;Brand Protection docs&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 31 Oct 2025 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>Workers, Durable Objects, Browser Run - Workers WebSocket message size limit increased from 1 MiB to 32 MiB</title><link>https://developers.cloudflare.com/changelog/post/2025-10-31-increased-websocket-message-size-limit/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-31-increased-websocket-message-size-limit/</guid><description>&lt;p&gt;Workers, including those using &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/&quot;&gt;Durable Objects&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/browser-run/&quot;&gt;Browser Rendering&lt;/a&gt;, may now process WebSocket messages up to 32 MiB in size. Previously, this limit was 1 MiB.&lt;/p&gt;
&lt;p&gt;This change allows Workers to handle use cases requiring large message sizes, such as processing Chrome Devtools Protocol messages.&lt;/p&gt;
&lt;p&gt;For more information, please see the &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/platform/limits/#sqlite-backed-durable-objects-general-limits&quot;&gt;Durable Objects startup limits&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 31 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Durable Objects</category><category>Browser Run</category></item><item><title>Workflows, Workers - Increased Workflows instance and concurrency limits</title><link>https://developers.cloudflare.com/changelog/post/2025-10-28-raising-limits/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-28-raising-limits/</guid><description>&lt;p&gt;We&apos;ve raised the &lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Cloudflare Workflows&lt;/a&gt; account-level limits for all accounts on the &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/pricing/&quot;&gt;Workers paid plan&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instance creation rate&lt;/strong&gt; increased from 100 workflow instances per 10 seconds to 100 instances per second&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concurrency limit&lt;/strong&gt; increased from 4,500 to 10,000 workflow instances per account&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/workflows/get-started/guide/&quot;&gt;the getting started guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If your application requires a higher limit, fill out the &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/limits/&quot;&gt;Limit Increase Request Form&lt;/a&gt; or contact your account team. Please refer to &lt;a href=&quot;https://developers.cloudflare.com/workflows/reference/pricing/&quot;&gt;Workflows pricing&lt;/a&gt; for more information.&lt;/p&gt;</description><pubDate>Fri, 31 Oct 2025 00:00:00 GMT</pubDate><product>Workflows</product><category>Workflows</category><category>Workers</category></item><item><title>Cloudflare Fundamentals - Introducing email two-factor authentication</title><link>https://developers.cloudflare.com/changelog/post/2025-10-30-email-2FA/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-30-email-2FA/</guid><description>&lt;p&gt;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&apos;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;You can now enable email 2FA on the Cloudflare dashboard:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Profile&lt;/strong&gt; at the top right corner.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Authentication&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Two-Factor Authentication&lt;/strong&gt;, select &lt;strong&gt;Set up&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;sign-in-security-best-practices&quot;&gt;Sign-in security best practices&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#sign-in-security-best-practices&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Use 2FA to make it harder for an attacker to get into your account in the event your password is leaked.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;If you use an app to manage your 2FA keys, enable cloud backup, so that you don&apos;t lose your keys in the event you lose your phone.&lt;/li&gt;
&lt;li&gt;If you use a custom email domain to sign in, &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/dashboard-sso/&quot;&gt;configure SSO&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;If you manage a Cloudflare account for work:
&lt;ul&gt;
&lt;li&gt;Have at least two administrators in case one of them unexpectedly leaves your company.&lt;/li&gt;
&lt;li&gt;Use SCIM to automate permissions management for members in your Cloudflare account.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 30 Oct 2025 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Cloudflare Fundamentals - Revamped Member Management UI</title><link>https://developers.cloudflare.com/changelog/post/2025-10-30-member-management-improvements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-30-member-management-improvements/</guid><description>&lt;p&gt;As Cloudflare&apos;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s New&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Refreshed member invite flow&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We overhauled the Invite Members UI to simplify inviting users and assigning permissions.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=800,height=435,format=webp/_astro/2025-10-30-invite-experience.B7F3VQ_y.gif&quot; alt=&quot;Updated Invite Flow UX&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;435&quot;&gt;
&lt;p&gt;&lt;strong&gt;Refreshed Members Overview Page&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&apos;ve updated the Members Overview Page to clearly display:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Member 2FA status&lt;/li&gt;
&lt;li&gt;Which members hold Super Admin privileges&lt;/li&gt;
&lt;li&gt;API access settings per member&lt;/li&gt;
&lt;li&gt;Member onboarding state (accepted vs pending invite)&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=3016,height=1424,format=webp/_astro/2025-10-30-member-management-screen.BLc2lx98.png&quot; alt=&quot;Updated Member Management Overview&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3016&quot; height=&quot;1424&quot;&gt;
&lt;p&gt;&lt;strong&gt;New Member Permission Policies Details View&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We&apos;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=800,height=435,format=webp/_astro/2025-10-30-permission-policies-screen.pMj53si2.gif&quot; alt=&quot;Updated Permission Policies Details Screen&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;435&quot;&gt;
&lt;p&gt;&lt;strong&gt;Improved Member Permission Workflow&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We redesigned the permission management experience to make it faster and easier for administrators to review roles and grant access.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=800,height=435,format=webp/_astro/2025-10-30-permission-policies-screen.pMj53si2.gif&quot; alt=&quot;Updated Member Permission Management UX&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;800&quot; height=&quot;435&quot;&gt;
&lt;p&gt;&lt;strong&gt;Account-scoped Policies Restrictions Relaxed&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Previously, customers could only associate a single account-scoped policy with a member. We&apos;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.&lt;/p&gt;</description><pubDate>Thu, 30 Oct 2025 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Rules - New TCP-based fields available in Rulesets</title><link>https://developers.cloudflare.com/changelog/post/2025-10-30-tcp-rtt-and-tcp-fields/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-30-tcp-rtt-and-tcp-fields/</guid><description>&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;build-rules-based-on-tcp-transport-and-latency&quot;&gt;Build rules based on TCP transport and latency&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#build-rules-based-on-tcp-transport-and-latency&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-fields&quot;&gt;New fields&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-fields&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.edge.client_tcp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;td&gt;Indicates whether the request used TCP. A value of true means the client connected using TCP instead of QUIC.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cf.timings.client_tcp_rtt_msec&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Number&lt;/td&gt;
&lt;td&gt;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.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Example filter expression:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;plaintext&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot; data-nb-lang=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-wvjl67&quot;&gt;cf.edge.client_tcp &amp;amp;&amp;amp; cf.timings.client_tcp_rtt_msec &amp;lt; 100&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;More information can be found in the Rules language &lt;a href=&quot;https://developers.cloudflare.com/ruleset-engine/rules-language/fields/reference/&quot;&gt;fields reference&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 30 Oct 2025 00:00:00 GMT</pubDate><product>Rules</product><category>Rules</category></item><item><title>WAF - WAF Release - 2025-10-30 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2025-10-30-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-30-emergency-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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&apos;s patches and recommended mitigations to reduce this exposure.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;2749f13f8cb34a3dbd49c8c48827402f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8827402f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Oracle E-Business Suite - SSRF - CVE:CVE-2025-61884&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Thu, 30 Oct 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - Access Workers preview URLs from the Build details page</title><link>https://developers.cloudflare.com/changelog/post/2025-10-30-builds-preview/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-30-builds-preview/</guid><description>&lt;p&gt;You can now access &lt;a href=&quot;https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/&quot;&gt;preview URLs&lt;/a&gt; directly from the build details page, making it easier to test your changes when reviewing builds in the dashboard.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1656,height=1112,format=webp/_astro/builds-preview-button.CjGnhkt7.png&quot; alt=&quot;preview button&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1656&quot; height=&quot;1112&quot;&gt;
&lt;p&gt;&lt;strong&gt;What&apos;s new&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Preview&lt;/strong&gt; button now appears in the top-right corner of the build details page for successful builds&lt;/li&gt;
&lt;li&gt;Click it to instantly open the latest preview URL&lt;/li&gt;
&lt;li&gt;Matches the same experience you&apos;re familiar with from Pages&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 30 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Access - Access private hostname applications support all ports/protocols</title><link>https://developers.cloudflare.com/changelog/post/2025-10-28-Access-Application-Support-For-All-Ports-And-Protocols/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-28-Access-Application-Support-For-All-Ports-And-Protocols/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/self-hosted-private-app/&quot;&gt;Cloudflare Access for private hostname applications&lt;/a&gt; can now secure traffic on all ports and protocols.&lt;/p&gt;
&lt;p&gt;Previously, applying Zero Trust policies to private applications required the application to use HTTPS on port &lt;code&gt;443&lt;/code&gt; and support Server Name Indicator (SNI).&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1283,height=496,format=webp/_astro/internal_private_app_any_port.DNXnEy0u.png&quot; alt=&quot;Example private application on non-443 port&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1283&quot; height=&quot;496&quot;&gt;
&lt;p&gt;For example, you can now create a self-hosted application in Access for &lt;code&gt;ssh.testapp.local&lt;/code&gt; running on port &lt;code&gt;22&lt;/code&gt;. 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.&lt;/p&gt;
&lt;p&gt;This feature is generally available across all plans.&lt;/p&gt;</description><pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>AI Search - Reranking and API-based system prompt configuration in AI Search</title><link>https://developers.cloudflare.com/changelog/post/2025-10-27-ai-search-reranking-system-prompt/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-27-ai-search-reranking-system-prompt/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AI Search&lt;/a&gt; now supports reranking for improved retrieval quality and allows you to set the system prompt directly in your API requests.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;rerank-for-more-relevant-results&quot;&gt;Rerank for more relevant results&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#rerank-for-more-relevant-results&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can now enable &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/retrieval/reranking/&quot;&gt;reranking&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;You can enable and configure reranking in the dashboard or directly in your API requests:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; answer&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;autorag&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-autorag&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;aiSearch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	query: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;How do I train a llama to deliver coffee?&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/meta/llama-3.3-70b-instruct-fp8-fast&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	reranking: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		enabled: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		model: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/baai/bge-reranker-base&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;set-system-prompts-in-api&quot;&gt;Set system prompts in API&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#set-system-prompts-in-api&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Previously, &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/retrieval/system-prompt/&quot;&gt;system prompts&lt;/a&gt; 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:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Dynamically set query and system prompt in AI Search&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; function&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getAnswer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;tone&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; systemPrompt&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; `You are a ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;tone&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;} assistant.`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; response&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;autorag&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-autorag&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;aiSearch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		query: query,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		system_prompt: systemPrompt,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; response;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Example usage&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; query&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;What is Cloudflare?&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tone&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;friendly&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; answer&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getAnswer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(query, tone);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(answer);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/retrieval/reranking/&quot;&gt;Reranking&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/retrieval/system-prompt/&quot;&gt;System Prompt&lt;/a&gt; in AI Search.&lt;/p&gt;</description><pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>CASB - CASB introduces new granular roles</title><link>https://developers.cloudflare.com/changelog/post/2025-10-28-casb-roles/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-28-casb-roles/</guid><description>&lt;p&gt;Cloudflare CASB (Cloud Access Security Broker) now supports two new granular roles to provide more precise access control for your security teams:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare CASB Read:&lt;/strong&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare CASB:&lt;/strong&gt; Provides full administrative access to configure and manage all aspects of the CASB product.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;strong&gt;Super Administrator&lt;/strong&gt; or &lt;strong&gt;Administrator&lt;/strong&gt; roles.&lt;/p&gt;
&lt;p&gt;To enable &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/data-loss-prevention/dlp-profiles/&quot;&gt;Data Loss Prevention (DLP)&lt;/a&gt;, scans in CASB, account members will need the &lt;strong&gt;Cloudflare Zero Trust&lt;/strong&gt; role.&lt;/p&gt;
&lt;p&gt;You can find these new roles when inviting members or creating API tokens in the Cloudflare dashboard under &lt;strong&gt;Manage Account&lt;/strong&gt; &amp;gt; &lt;strong&gt;Members&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;To learn more about managing roles and permissions, refer to the &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/roles/&quot;&gt;Manage account members and roles documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate><product>CASB</product><category>CASB</category></item><item><title>Gateway - New Application Categories added for HTTP Traffic Management</title><link>https://developers.cloudflare.com/changelog/post/Gateway-application-categories-added/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/Gateway-application-categories-added/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Business&lt;/li&gt;
&lt;li&gt;Education&lt;/li&gt;
&lt;li&gt;Entertainment &amp;amp; Events&lt;/li&gt;
&lt;li&gt;Food &amp;amp; Drink&lt;/li&gt;
&lt;li&gt;Health &amp;amp; Fitness&lt;/li&gt;
&lt;li&gt;Lifestyle&lt;/li&gt;
&lt;li&gt;Navigation&lt;/li&gt;
&lt;li&gt;Photography &amp;amp; Graphic Design&lt;/li&gt;
&lt;li&gt;Travel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The new categories are live now, but we are providing a transition period for existing applications to be fully remapped to these new categories.&lt;/p&gt;
&lt;p&gt;The full remapping will be completed by January 30, 2026.&lt;/p&gt;
&lt;p&gt;We encourage you to use this time to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Review the new category structure.&lt;/li&gt;
&lt;li&gt;Identify and adjust any existing HTTP policies that reference older categories to ensure a smooth transition.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information on creating HTTP policies, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/application-app-types/&quot;&gt;Applications and app types&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 28 Oct 2025 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category></item><item><title>Logs - Azure Sentinel Connector</title><link>https://developers.cloudflare.com/changelog/post/2025-10-27-Sentinel-connector/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-27-Sentinel-connector/</guid><description>&lt;p&gt;Logpush now supports integration with &lt;a href=&quot;https://www.microsoft.com/en-us/security/business/siem-and-xdr/microsoft-sentinel&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Microsoft Sentinel&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.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.&lt;/p&gt;
&lt;p&gt;This upgrade significantly streamlines log ingestion, improves security, and provides greater control:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simplified Implementation: Easier for engineering teams to set up and maintain.&lt;/li&gt;
&lt;li&gt;Cost Control: New support for Data Collection Rules (DCRs) allows you to filter and transform logs at ingestion time, offering potential cost savings.&lt;/li&gt;
&lt;li&gt;Enhanced Security: CCF provides a higher level of security compared to the older Azure Functions connector.&lt;/li&gt;
&lt;li&gt;Data Lake Integration: Includes native integration with Data Lake.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Find the new solution &lt;a href=&quot;https://marketplace.microsoft.com/en-us/product/azure-application/cloudflare.azure-sentinel-solution-cloudflare-ccf?tab=Overview&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;here&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and refer to the &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-integrations/sentinel/#supported-logs:~:text=WorkBook%20fields,-Analytic%20rules&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare&apos;s developer documentation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;for more information on the connector, including setup steps, supported logs and Microsoft&apos;s resources.&lt;/p&gt;</description><pubDate>Mon, 27 Oct 2025 00:00:00 GMT</pubDate><product>Logs</product><category>Logs</category></item><item><title>Radar - TLD Insights in Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2025-10-27-radar-tld-insights/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-27-radar-tld-insights/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/1.1.1.1/&quot;&gt;1.1.1.1&lt;/a&gt; DNS resolver.&lt;/p&gt;
&lt;p&gt;The following dimensions were added to the Radar DNS API, specifically, to the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/dns/methods/summary_v2/&quot;&gt;&lt;code&gt;/dns/summary/{dimension}&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/dns/methods/timeseries_groups_v2/&quot;&gt;&lt;code&gt;/dns/timeseries_groups/{dimension}&lt;/code&gt;&lt;/a&gt; endpoints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tld&lt;/code&gt;: Top-level domain extracted from DNS queries; can also be used as a filter.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tld_dns_magnitude&lt;/code&gt;: Top-level domain ranking by &lt;a href=&quot;https://developers.cloudflare.com/radar/glossary#dns-magnitude&quot;&gt;DNS magnitude&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the following endpoints were added:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/tlds/methods/list/&quot;&gt;&lt;code&gt;/tlds&lt;/code&gt;&lt;/a&gt; - Lists all TLDs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/tlds/methods/get/&quot;&gt;&lt;code&gt;/tlds/{tld}&lt;/code&gt;&lt;/a&gt; - Retrieves information about a specific TLD.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=2344,format=webp/_astro/tld-ranking-by-dns-magnitude.DbmrooPK.png&quot; alt=&quot;Screenshot of the TLD ranking by DNS magnitude&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;2344&quot;&gt;
&lt;p&gt;Learn more about the new Radar DNS insights in our &lt;a href=&quot;https://blog.cloudflare.com/introducing-tld-insights-on-cloudflare-radar/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;blog post&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, and check out the &lt;a href=&quot;https://radar.cloudflare.com/tlds&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;new Radar page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 27 Oct 2025 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Security Center - Cloudforce One RFI tokens are now visible in the dashboard</title><link>https://developers.cloudflare.com/changelog/post/2025-10-27-RFI-Tokens-in-Dash/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-27-RFI-Tokens-in-Dash/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2380,height=1216,format=webp/_astro/2025-10-24RFITokens.DPm1e8uC.png&quot; alt=&quot;Cloudforce One RFI tokens&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2380&quot; height=&quot;1216&quot;&gt;
&lt;p&gt;What’s new:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Users can now see the number of tokens used for a submitted request for information.&lt;/li&gt;
&lt;li&gt;Users can see the remaining tokens allocated to their account for the quarter.&lt;/li&gt;
&lt;li&gt;Users can only select the Routine priority for the &lt;code&gt;Strategic Threat Research&lt;/code&gt; request type.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cloudforce One subscribers can try it now in &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/security-center/threat-intelligence/requests&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Application Security &amp;gt; Threat Intelligence &amp;gt; Requests for Information&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 27 Oct 2025 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>WAF - WAF Release - 2025-10-24 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2025-10-24-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-24-emergency-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;5eaeb5ea6e5a4bce867eb3ffbd72ba08&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...bd72ba08&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Windows Server - Deserialization - CVE:CVE-2025-59287&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Fri, 24 Oct 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - Automatic resource provisioning for KV, R2, and D1</title><link>https://developers.cloudflare.com/changelog/post/2025-10-24-automatic-resource-provisioning/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-24-automatic-resource-provisioning/</guid><description>
&lt;p&gt;Previously, if you wanted to develop or deploy a worker with attached resources, you&apos;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.&lt;/p&gt;
&lt;p&gt;Automatic provisioning is launching as an open beta, and we&apos;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 &lt;code&gt;--no-x-provision&lt;/code&gt; flag.&lt;/p&gt;
&lt;p&gt;To use this feature, update to wrangler@4.45.0 and add bindings to your config file &lt;em&gt;without&lt;/em&gt; resource IDs e.g.:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;kv_namespaces&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [{ &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_KV&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;d1_databases&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [{ &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_DB&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;r2_buckets&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [{ &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;MY_R2&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;code&gt;wrangler dev&lt;/code&gt; will then automatically create these resources for you locally, and on your next run of &lt;code&gt;wrangler deploy&lt;/code&gt;, Wrangler will call the Cloudflare API to create the requested resources and link them to your Worker.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</description><pubDate>Fri, 24 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Build TanStack Start apps with the Cloudflare Vite plugin</title><link>https://developers.cloudflare.com/changelog/post/2025-10-24-tanstack-start/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-24-tanstack-start/</guid><description>
&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/&quot;&gt;Cloudflare Vite plugin&lt;/a&gt; now supports &lt;a href=&quot;https://tanstack.com/start/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;TanStack Start&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; apps.
Get started with new or existing projects.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;new-projects&quot;&gt;New projects&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#new-projects&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Create a new TanStack Start project that uses the Cloudflare Vite plugin via the &lt;code&gt;create-cloudflare&lt;/code&gt; CLI:&lt;/p&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-de0d9816-f408-44f9-ab04-538dcda91485-npm&quot; id=&quot;pm-tab-pm-de0d9816-f408-44f9-ab04-538dcda91485-npm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-de0d9816-f408-44f9-ab04-538dcda91485-yarn&quot; id=&quot;pm-tab-pm-de0d9816-f408-44f9-ab04-538dcda91485-yarn&quot; data-nb-pm-tab class=&quot;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&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-de0d9816-f408-44f9-ab04-538dcda91485-pnpm&quot; id=&quot;pm-tab-pm-de0d9816-f408-44f9-ab04-538dcda91485-pnpm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;pnpm&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-de0d9816-f408-44f9-ab04-538dcda91485-npm&quot; aria-labelledby=&quot;pm-tab-pm-de0d9816-f408-44f9-ab04-538dcda91485-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; create cloudflare@latest -- my-tanstack-start-app --framework=tanstack-start&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm create cloudflare@latest -- my-tanstack-start-app --framework=tanstack-start&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-de0d9816-f408-44f9-ab04-538dcda91485-yarn&quot; aria-labelledby=&quot;pm-tab-pm-de0d9816-f408-44f9-ab04-538dcda91485-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; create cloudflare my-tanstack-start-app --framework=tanstack-start&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn create cloudflare my-tanstack-start-app --framework=tanstack-start&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-de0d9816-f408-44f9-ab04-538dcda91485-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-de0d9816-f408-44f9-ab04-538dcda91485-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; create cloudflare@latest my-tanstack-start-app --framework=tanstack-start&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm create cloudflare@latest my-tanstack-start-app --framework=tanstack-start&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/package-managers/PackageManagers.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;existing-projects&quot;&gt;Existing projects&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#existing-projects&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Migrate an existing TanStack Start project to use the Cloudflare Vite plugin:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install &lt;code&gt;@cloudflare/vite-plugin&lt;/code&gt; and &lt;code&gt;wrangler&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;script&gt;
	if (!customElements.get(&quot;nb-pm-restore&quot;)) {
		customElements.define(
			&quot;nb-pm-restore&quot;,
			class extends HTMLElement {
				connectedCallback() {
					const card = this.closest(&quot;[data-nb-pm]&quot;);
					if (!card) return;
					let saved;
					try {
						saved = sessionStorage.getItem(&quot;ui-pm-tab&quot;);
					} catch {
						return;
					}
					if (!saved) return;
					const tabs = card.querySelectorAll(&quot;[data-nb-pm-tab]&quot;);
					let idx = -1;
					tabs.forEach(function (t, i) {
						if (t.textContent.trim() === saved) idx = i;
					});
					if (idx &lt; 1) return;
					tabs.forEach(function (t, i) {
						t.setAttribute(&quot;aria-selected&quot;, String(i === idx));
					});
					card.querySelectorAll(&quot;[data-nb-pm-panel]&quot;).forEach(function (p, i) {
						p.hidden = i !== idx;
					});
				}
			},
		);
	}
&lt;/script&gt;&lt;div data-nb-pm class=&quot;w-full&quot;&gt;&lt;div class=&quot;flex w-full flex-col overflow-hidden rounded-lg text-sm ring ring-border bg-card&quot;&gt;&lt;div class=&quot;flex items-center gap-2 px-3 py-2 text-[0.8125rem] font-medium leading-5 text-muted-foreground bg-[var(--nb-surface-sunken)]&quot; role=&quot;tablist&quot; aria-label=&quot;Package manager&quot;&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;true&quot; aria-controls=&quot;pm-panel-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-npm&quot; id=&quot;pm-tab-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-npm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;npm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-yarn&quot; id=&quot;pm-tab-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-yarn&quot; data-nb-pm-tab class=&quot;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&quot;&gt;yarn&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-pnpm&quot; id=&quot;pm-tab-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-pnpm&quot; data-nb-pm-tab class=&quot;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&quot;&gt;pnpm&lt;/button&gt;&lt;button role=&quot;tab&quot; type=&quot;button&quot; aria-selected=&quot;false&quot; aria-controls=&quot;pm-panel-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-bun&quot; id=&quot;pm-tab-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-bun&quot; data-nb-pm-tab class=&quot;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&quot;&gt;bun&lt;/button&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-npm&quot; aria-labelledby=&quot;pm-tab-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-npm&quot; data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;npm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; i -D @cloudflare/vite-plugin wrangler&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;npm i -D @cloudflare/vite-plugin wrangler&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-yarn&quot; aria-labelledby=&quot;pm-tab-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-yarn&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;yarn&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add -D @cloudflare/vite-plugin wrangler&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;yarn add -D @cloudflare/vite-plugin wrangler&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-pnpm&quot; aria-labelledby=&quot;pm-tab-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-pnpm&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;pnpm&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add -D @cloudflare/vite-plugin wrangler&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;pnpm add -D @cloudflare/vite-plugin wrangler&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; id=&quot;pm-panel-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-bun&quot; aria-labelledby=&quot;pm-tab-pm-95fd8a79-6623-42a4-97cf-9030b9529b7e-bun&quot; hidden data-nb-pm-panel class=&quot;bg-card ring-border relative overflow-hidden rounded-lg text-inherit ring&quot;&gt;&lt;div class=&quot;flex items-stretch&quot;&gt;&lt;pre class=&quot;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&quot;&gt;&lt;code data-nb-pm-code&gt;&lt;span class=&quot;text-success&quot;&gt;bun&lt;/span&gt;&lt;span class=&quot;text-warning&quot;&gt; add -d @cloudflare/vite-plugin wrangler&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;button type=&quot;button&quot; data-nb-pm-copy data-nb-command=&quot;bun add -d @cloudflare/vite-plugin wrangler&quot; aria-label=&quot;Copy to clipboard&quot; class=&quot;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&quot;&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[18px] w-[18px]&quot; data-icon=&quot;ph:copy&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;hidden h-[18px] w-[18px]&quot; data-icon=&quot;ph:check&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/button&gt;&lt;/div&gt;&lt;/div&gt;&lt;nb-pm-restore style=&quot;display:contents&quot;&gt;&lt;/nb-pm-restore&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Add the Cloudflare plugin to your Vite config&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;vite.config.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { defineConfig } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;vite&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { tanstackStart } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@tanstack/react-start/plugin/vite&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; viteReact &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@vitejs/plugin-react&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line highlighted&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { cloudflare } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@cloudflare/vite-plugin&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; defineConfig&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	plugins: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line highlighted&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		cloudflare&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ viteEnvironment: { name: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;ssr&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		tanstackStart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		viteReact&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Add your Worker config file&lt;/li&gt;
&lt;/ol&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;$schema&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-tanstack-start-app&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Set this to today&apos;s date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;compatibility_date&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-08-14&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;compatibility_flags&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;		&quot;nodejs_compat&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;main&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@tanstack/react-start/server-entry&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&quot;$schema&quot; = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./node_modules/wrangler/config-schema.json&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-tanstack-start-app&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Set this to today&apos;s date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;compatibility_date = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-08-14&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;compatibility_flags = [ &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;nodejs_compat&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;main = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@tanstack/react-start/server-entry&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;Modify the scripts in your &lt;code&gt;package.json&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;json&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;package.json&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;json&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;dev&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;vite dev&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;vite build &amp;amp;&amp;amp; tsc --noEmit&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line diff remove&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;start&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;node .output/server/index.mjs&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line diff add&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;preview&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;vite preview&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line diff add&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;deploy&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;npm run build &amp;amp;&amp;amp; wrangler deploy&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line diff add&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;cf-typegen&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;wrangler types&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/workers/framework-guides/web-apps/tanstack-start/&quot;&gt;TanStack Start framework guide&lt;/a&gt; for more info.&lt;/p&gt;</description><pubDate>Fri, 24 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>WAF - WAF Release - 2025-10-23 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2025-10-23-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-23-emergency-waf-release/</guid><description>
&lt;p&gt;This week highlights enhancements to detection signatures improving coverage for vulnerabilities in Adobe Commerce and Magento Open Source, linked to CVE-2025-54236.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;6e04fa2b9eb34fb088034d3fc6ef59a1&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...c6ef59a1&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Adobe Commerce - Remote Code Execution - CVE:CVE-2025-54236&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Thu, 23 Oct 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers AI - Workers AI Markdown Conversion: New endpoint to list supported formats</title><link>https://developers.cloudflare.com/changelog/post/2025-10-23-new-markdown-conversion-endpoint/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-23-new-markdown-conversion-endpoint/</guid><description>&lt;p&gt;Developers can now programmatically retrieve a list of all file formats supported by the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/&quot;&gt;Markdown Conversion utility&lt;/a&gt; in Workers AI.&lt;/p&gt;
&lt;p&gt;You can use the &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/configuration/bindings/&quot;&gt;&lt;code&gt;env.AI&lt;/code&gt;&lt;/a&gt; binding:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;typescript&quot; data-nb-lang=&quot;typescript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toMarkdown&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;supported&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Or call the REST API:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://api.cloudflare.com/client/v4/accounts/{ACCOUNT_ID}/ai/tomarkdown/supported&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Authorization: Bearer {API_TOKEN}&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Both return a list of file formats that users can convert into Markdown:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;json&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot; data-nb-lang=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;extension&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;.pdf&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;mimeType&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;application/pdf&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;extension&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;.jpeg&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;		&quot;mimeType&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;image/jpeg&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-2bbn9v&quot;&gt;	...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Learn more about our &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/features/markdown-conversion/&quot;&gt;Markdown Conversion utility&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 23 Oct 2025 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workers - Workers Preview URL default behavior now matches your workers.dev setting</title><link>https://developers.cloudflare.com/changelog/post/2025-10-23-preview-url-default-behavior/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-23-preview-url-default-behavior/</guid><description>&lt;p&gt;We have updated the default behavior for Cloudflare Workers &lt;a href=&quot;https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/&quot;&gt;Preview URLs&lt;/a&gt;. &lt;strong&gt;Going forward, if a preview URL setting is not &lt;a href=&quot;https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/#toggle-preview-urls-enable-or-disable&quot;&gt;explicitly configured&lt;/a&gt; during deployment, its default behavior will automatically match the setting of your &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/routing/workers-dev/&quot;&gt;&lt;code&gt;workers.dev&lt;/code&gt; subdomain&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This change is intended to provide a more intuitive and secure experience by aligning your preview URL&apos;s default state with your &lt;code&gt;workers.dev&lt;/code&gt; configuration to prevent cases where a preview URL might remain public even after you disabled your &lt;code&gt;workers.dev&lt;/code&gt; route.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What this means for you:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If neither setting is configured:&lt;/strong&gt; both the workers.dev route and the preview URL will default to enabled&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If your workers.dev route is enabled and you do not explicitly set Preview URLs to enabled or disabled:&lt;/strong&gt; Preview URLs will default to enabled&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If your workers.dev route is disabled and you do not explicitly set Preview URLs to enabled or disabled:&lt;/strong&gt; Preview URLs will default to disabled&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can override the default setting by explicitly enabling or disabling the preview URL in your Worker&apos;s configuration through the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/subdomain/&quot;&gt;API&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/#from-the-dashboard&quot;&gt;Dashboard&lt;/a&gt;, or &lt;a href=&quot;https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/#from-the-wrangler-configuration-file&quot;&gt;Wrangler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wrangler Version Behavior&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Before v4.34.0:&lt;/strong&gt; Preview URLs defaulted to enabled, regardless of the workers.dev setting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;v4.34.0 up to (but not including) v4.44.0:&lt;/strong&gt; Preview URLs defaulted to disabled, regardless of the workers.dev setting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;v4.44.0 or later:&lt;/strong&gt; Preview URLs now default to matching your workers.dev setting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why we’re making this change&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In July, &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-07-23-workers-preview-urls/&quot;&gt;we introduced preview URLs to Workers&lt;/a&gt;, 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 &lt;code&gt;workers.dev&lt;/code&gt; (ex: &lt;code&gt;preview-id-worker-name.account-name.workers.dev&lt;/code&gt;) would still be live even if you had disabled your Worker’s &lt;code&gt;workers.dev&lt;/code&gt; route. If you misinterpreted what it meant to disable your &lt;code&gt;workers.dev&lt;/code&gt; route, you might unintentionally leave preview URLs enabled when you didn’t mean to, and expose them to the public Internet.&lt;/p&gt;
&lt;p&gt;To address this, we made a &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-09-17-update-preview-url-setting/&quot;&gt;one-time update&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;While this change helped secure many customers, it was disruptive for customers who keep their &lt;code&gt;workers.dev&lt;/code&gt; 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 &lt;code&gt;workers.dev&lt;/code&gt; configuration by default, providing a more secure and predictable experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Securing access to &lt;code&gt;workers.dev&lt;/code&gt; and preview URL endpoints&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To further secure your &lt;code&gt;workers.dev&lt;/code&gt; subdomain and preview URL, you can &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-10-03-one-click-access-for-workers/&quot;&gt;enable Cloudflare Access with a single click&lt;/a&gt; in your Worker&apos;s settings to limit access to specific users or groups.&lt;/p&gt;</description><pubDate>Thu, 23 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>AI Crawl Control - New Robots.txt tab for tracking crawler compliance</title><link>https://developers.cloudflare.com/changelog/post/2025-10-21-track-robots-txt/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-21-track-robots-txt/</guid><description>&lt;p&gt;AI Crawl Control now includes a &lt;strong&gt;Robots.txt&lt;/strong&gt; tab that provides insights into how AI crawlers interact with your &lt;code&gt;robots.txt&lt;/code&gt; files.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The Robots.txt tab allows you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Monitor the health status of &lt;code&gt;robots.txt&lt;/code&gt; files across all your hostnames, including HTTP status codes, and identify hostnames that need a &lt;code&gt;robots.txt&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Track the total number of requests to each &lt;code&gt;robots.txt&lt;/code&gt; file, with breakdowns of successful versus unsuccessful requests.&lt;/li&gt;
&lt;li&gt;Check whether your &lt;code&gt;robots.txt&lt;/code&gt; files contain &lt;a href=&quot;https://contentsignals.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Content Signals&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; directives for AI training, search, and AI input.&lt;/li&gt;
&lt;li&gt;Identify crawlers that request paths explicitly disallowed by your &lt;code&gt;robots.txt&lt;/code&gt; directives, including the crawler name, operator, violated path, specific directive, and violation count.&lt;/li&gt;
&lt;li&gt;Filter &lt;code&gt;robots.txt&lt;/code&gt; request data by crawler, operator, category, and custom time ranges.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;take-action&quot;&gt;Take action&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#take-action&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When you identify non-compliant crawlers, you can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Block the crawler in the &lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/features/manage-ai-crawlers/&quot;&gt;Crawlers tab&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Create custom &lt;a href=&quot;https://developers.cloudflare.com/waf/&quot;&gt;WAF rules&lt;/a&gt; for path-specific security&lt;/li&gt;
&lt;li&gt;Use &lt;a href=&quot;https://developers.cloudflare.com/rules/url-forwarding/&quot;&gt;Redirect Rules&lt;/a&gt; to guide crawlers to appropriate areas of your site&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, go to &lt;strong&gt;AI Crawl Control&lt;/strong&gt; &amp;gt; &lt;strong&gt;Robots.txt&lt;/strong&gt; in the Cloudflare dashboard. Learn more in the &lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control/features/track-robots-txt/&quot;&gt;Track robots.txt documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 21 Oct 2025 00:00:00 GMT</pubDate><product>AI Crawl Control</product><category>AI Crawl Control</category></item><item><title>Gateway - Schedule DNS policies from the UI</title><link>https://developers.cloudflare.com/changelog/post/2025-10-20-schedule-dns-policies-from-the-ui/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-20-schedule-dns-policies-from-the-ui/</guid><description>&lt;p&gt;Admins can now create &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/dns-policies/timed-policies/&quot;&gt;scheduled DNS policies&lt;/a&gt; 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.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Preset Schedules&lt;/strong&gt;: Use built-in templates for common scenarios like Business Hours, School Days, Weekends, and more.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom Schedules&lt;/strong&gt;: Define your own schedule with specific days and up to three non-overlapping time ranges per day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timezone Control&lt;/strong&gt;: Choose to enforce a schedule in a specific timezone (for example, US Eastern) or based on the local time of each user.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Combined with Duration&lt;/strong&gt;: Policies can have both a schedule and a duration. If both are set, the duration&apos;s expiration takes precedence.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can see the flow in the demo GIF:&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1053,height=879,format=webp/_astro/gateway-dns-scheduled-policies-ui.Cf4l1OTE.gif&quot; alt=&quot;Schedule DNS policies demo&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1053&quot; height=&quot;879&quot;&gt;
&lt;p&gt;This update makes time-based DNS policies accessible to all Gateway customers, removing the technical barrier of the API.&lt;/p&gt;</description><pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category></item><item><title>WAF - WAF Release - 2025-10-20</title><link>https://developers.cloudflare.com/changelog/post/2025-10-20-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-20-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;New WAF rule deployed for Oracle E-Business Suite (CVE-2025-61882) to block  unauthenticated attacker&apos;s network access via HTTP to compromise Oracle Concurrent Processing. If successfully exploited, this vulnerability may result in remote code execution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;933fc13202cd4e8ba498c0f32b4101ab&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...2b4101ab&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;100598A&lt;/td&gt;&lt;td&gt;Remote Code Execution - Common Bash Bypass - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule is merged into the original rule &quot;Remote Code Execution - Common Bash Bypass&quot; (ID: &lt;rule-id id=&quot;f8238867ed3e4d3a9a7b731a50cec478&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...50cec478&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;185b5df42d1e44e0aeb8f8b8a1118614&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...a1118614&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100916A&lt;/td&gt;&lt;td&gt;Oracle E-Business Suite - Remote Code Execution - CVE:CVE-2025-61882 - 2&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;646bccf7e9dc46918a4150d6c22b51d3&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...c22b51d3&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;HTTP Truncated&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Email security - On-Demand Security Report</title><link>https://developers.cloudflare.com/changelog/post/2025-10-16-on-demand-security-report/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-16-on-demand-security-report/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;These reports offer several key benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Executive Summary:&lt;/strong&gt; Quickly view the performance of Email security with a high-level executive summary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actionable Insights:&lt;/strong&gt; Dive deep into trend data, breakdowns of threat types, and analysis of top targets to identify and address vulnerabilities.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration Transparency:&lt;/strong&gt; Gain a clear view of your policy, submission, and domain configurations to ensure optimal setup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Account Takeover Risks:&lt;/strong&gt; Get a snapshot of your M365 risky users (requires a Microsoft Entra ID P2 license and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/cloud-and-saas/microsoft-365/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;M365 SaaS integration&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/email-security/monitoring/download-report/#download-a-security-report&quot;&gt;Download a security report&lt;/a&gt;.
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1009,height=571,format=webp/_astro/report.CbkPa8Jt.png&quot; alt=&quot;Report&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1009&quot; height=&quot;571&quot;&gt;&lt;/p&gt;
&lt;p&gt;This feature is available across the following Email security packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advantage&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise + PhishGuard&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Fri, 17 Oct 2025 22:14:43 GMT</pubDate><product>Email security</product><category>Email security</category></item><item><title>Security Center - New Application Security reports (Closed Beta)</title><link>https://developers.cloudflare.com/changelog/post/2025-10-17-app-sec-reports/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-17-app-sec-reports/</guid><description>
&lt;p&gt;Cloudflare&apos;s new &lt;strong&gt;Application Security report&lt;/strong&gt;, currently in Closed Beta, is now available in the dashboard.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/security-center/reports&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Security reports&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;
&lt;p&gt;The reports are generated monthly and provide cyber security insights trends for all of the Enterprise zones in your Cloudflare account.&lt;/p&gt;
&lt;p&gt;The reports also include an industry benchmark, comparing your cyber security landscape to peers in your industry.&lt;/p&gt;
&lt;img src=&quot;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&quot; alt=&quot;Application Security report mock data&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2379&quot; height=&quot;3367&quot;&gt;
&lt;p&gt;Learn more about the reports by referring to the &lt;a href=&quot;https://developers.cloudflare.com/analytics/account-and-zone-analytics/app-security-reports/&quot;&gt;Security Reports documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Use the feedback survey link at the top of the page to help us improve the reports.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1126,height=448,format=webp/_astro/2025-10-17-report-feedback-survey.DPmUlWh2.png&quot; alt=&quot;Application Security report survey&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1126&quot; height=&quot;448&quot;&gt;</description><pubDate>Fri, 17 Oct 2025 00:00:00 GMT</pubDate><product>Security Center</product><category>Security Center</category></item><item><title>WAF - New detections released for WAF managed rulesets</title><link>https://developers.cloudflare.com/changelog/post/2025-10-17-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-17-emergency-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;New detections added for multiple exploit categories:&lt;/p&gt;
&lt;p&gt;SSRF (Server-Side Request Forgery) — new rules targeting both local and cloud metadata abuse patterns (Beta).&lt;/p&gt;
&lt;p&gt;SQL Injection (SQLi) — rules for common patterns, sleep/time-based injections, and string/wait function exploitation across headers and URIs.&lt;/p&gt;
&lt;p&gt;SSTI (Server-Side Template Injection) — arithmetic-based probe detections introduced across URI, header, and body fields.&lt;/p&gt;
&lt;p&gt;Reverse Shell and XXE payloads — enhanced heuristics for command execution and XML external entity misuse.&lt;/p&gt;
&lt;p&gt;Prototype Pollution — new Beta rule identifying common JSON payload structures used in object prototype poisoning.&lt;/p&gt;
&lt;p&gt;PHP Wrapper Injection and HTTP Parameter Pollution detections — to catch path traversal and multi-parameter manipulation attempts.&lt;/p&gt;
&lt;p&gt;Anomaly Header Checks — detecting CRLF injection attempts in header names.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Prototype Pollution and HTTP parameter pollution rules address emerging JavaScript supply-chain exploitation patterns increasingly seen in real-world incidents.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;72f0ff933fb0492eb71cda50589f2a1d&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...589f2a1d&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Anomaly:Header - name - CR, LF&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;5d0377e4435f467488614170132fab7e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...132fab7e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Reverse Shell - Body&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;54e32f7f802c4a699182e8921a027008&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1a027008&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Reverse Shell - Header&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;7cbda8dbafbc465d9b64a8f2958d0486&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...958d0486&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - Reverse Shell - URI&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;b9f3420674cf481da32333dc8e0cf7ad&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8e0cf7ad&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - XXE - Body&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ad55483512f0440b81426acdbf8aab5e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...bf8aab5e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - SQLi - Common Patterns - Header URI&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;849c0618d1674f1c92ba6f9b2e466337&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...2e466337&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - SQLi - Sleep Function - Header URI&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;1b4db4c4bd0649c095c27c6cb686ab47&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...b686ab47&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - SQLi - String Function - Header URI&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;fa2055b84af94ba4b925f834b0633709&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...b0633709&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Generic Rules - SQLi - WaitFor Function - Header URI&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;158177dec2504acdba1f2da201a076eb&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...01a076eb&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSRF - Local - Beta&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;98bfd6bb46074d5b8d1c4b39743a63ec&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...743a63ec&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSRF - Local - 2 - Beta&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;54e1733b10da4a599e06c6fbc2e84e2d&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...c2e84e2d&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSRF - Cloud - Beta&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ecd26d61a75e46f6a4449a06ab8af26f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ab8af26f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSRF - Cloud - 2 - Beta&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;c16f4e133c4541f293142d02e6e8dc5b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...e6e8dc5b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSTI - Arithmetic Probe - URI&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;f4fd9904e7624666b8c49cd62550d794&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...2550d794&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSTI - Arithmetic Probe - Header&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;5c0875604f774c36a4f9b69c659d12a6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...659d12a6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;SSTI - Arithmetic Probe - Body&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;fae6fa37ae9249d58628e54b1a3e521e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1a3e521e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;PHP Wrapper Injection&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;9c02e585db34440da620eb668f76bd74&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8f76bd74&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;PHP Wrapper Injection&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;cb67fe56a84747b8b64277dc091e296d&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...091e296d&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;HTTP parameter pollution&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;443b54d984944cd69043805ee34214ef&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...e34214ef&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Prototype Pollution - Common Payloads - Beta&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Fri, 17 Oct 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Cloudflare One Client - WARP client for Windows (version 2025.9.173.1)</title><link>https://developers.cloudflare.com/changelog/post/2025-10-16-warp-windows-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-16-warp-windows-beta/</guid><description>&lt;p&gt;A new Beta release for the Windows WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/&quot;&gt;beta releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improvements for &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/deployment/mdm-deployment/windows-multiuser/&quot;&gt;Windows multi-user&lt;/a&gt; to maintain the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#disconnect-warp-on-all-devices&quot;&gt;Global WARP override&lt;/a&gt; state when switching between users.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Deleting registrations no longer returns an error when succeeding.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd&quot;&gt;Windows 11 24H2 KB5062553&lt;/a&gt; or higher for resolution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server&quot;&gt;Route traffic to fallback server&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Devices with KB5055523 installed may receive a warning about &lt;code&gt;Win32/ClickFix.ABA&lt;/code&gt; being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to &lt;a href=&quot;https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0&quot;&gt;version 1.429.19.0&lt;/a&gt; or later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS resolution may be broken when the following conditions are all true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.&lt;/li&gt;
&lt;li&gt;A custom DNS server address is configured on the primary network adapter.&lt;/li&gt;
&lt;li&gt;The custom DNS server address on the primary network adapter is changed while WARP is connected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To work around this issue, reconnect the WARP client by toggling off and back on.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Thu, 16 Oct 2025 15:29:54 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - WARP client for macOS (version 2025.9.173.1)</title><link>https://developers.cloudflare.com/changelog/post/2025-10-16-warp-macos-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-16-warp-macos-beta/</guid><description>&lt;p&gt;A new Beta release for the macOS WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/&quot;&gt;beta releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Deleting registrations no longer returns an error when succeeding.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server&quot;&gt;Route traffic to fallback server&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Thu, 16 Oct 2025 15:29:52 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Durable Objects, Workers - View and edit Durable Object data in UI with Data Studio (Beta)</title><link>https://developers.cloudflare.com/changelog/post/2025-10-16-durable-objects-data-studio/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-16-durable-objects-data-studio/</guid><description>&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1699,height=407,format=webp/_astro/do-data-studio.BfCcgtkq.png&quot; alt=&quot;Screenshot of Durable Objects Data Studio&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1699&quot; height=&quot;407&quot;&gt;
&lt;p&gt;You can now view and write to each Durable Object&apos;s storage using a UI editor on the Cloudflare dashboard. Only Durable Objects using &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/best-practices/access-durable-objects-storage/#create-sqlite-backed-durable-object-class&quot;&gt;SQLite storage&lt;/a&gt; can use Data Studio.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers/durable-objects&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Durable Objects&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To access a Durable Object, you can provide an object&apos;s unique name or ID generated by Cloudflare. Data Studio requires you to have at least the &lt;code&gt;Workers Platform Admin&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;To learn more, visit the Data Studio &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/observability/data-studio/&quot;&gt;documentation&lt;/a&gt;. If you have feedback or suggestions for the new Data Studio, please share your experience on &lt;a href=&quot;https://discord.com/channels/595317990191398933/773219443911819284&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Discord&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description><pubDate>Thu, 16 Oct 2025 00:00:00 GMT</pubDate><product>Durable Objects</product><category>Durable Objects</category><category>Workers</category></item><item><title>Cloudflare Fundamentals - Increased HTTP header size limit to 128 KB</title><link>https://developers.cloudflare.com/changelog/post/2025-10-16-header-limit-increase/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-16-header-limit-increase/</guid><description>&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cdn-now-supports-128-kb-request-and-response-headers-&quot;&gt;CDN now supports 128 KB request and response headers 🚀&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cdn-now-supports-128-kb-request-and-response-headers-&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;We&apos;re excited to announce a significant increase in the maximum header size supported by Cloudflare&apos;s Content Delivery Network (CDN). Cloudflare now supports up to &lt;strong&gt;128 KB&lt;/strong&gt; for both &lt;strong&gt;request and response headers&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;code&gt;HTTP 413&lt;/code&gt; (Request Header Fields Too Large) errors.&lt;/p&gt;
&lt;hr&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s new?&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Support for large headers:&lt;/strong&gt; You can now utilize much larger headers, whether as a single large header up to 128 KB or split over multiple headers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduces &lt;code&gt;413&lt;/code&gt; and &lt;code&gt;520&lt;/code&gt; HTTP errors:&lt;/strong&gt; This change drastically reduces the likelihood of customers encountering &lt;code&gt;HTTP 413&lt;/code&gt; errors from large request headers or &lt;code&gt;HTTP 520&lt;/code&gt; errors caused by oversized response headers, improving the overall reliability of your web applications.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhanced functionality:&lt;/strong&gt; This is especially beneficial for applications that rely on:
&lt;ul&gt;
&lt;li&gt;A large number of cookies.&lt;/li&gt;
&lt;li&gt;Large Content-Security-Policy (CSP) response headers.&lt;/li&gt;
&lt;li&gt;Advanced use cases with Cloudflare Workers that generate large response headers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This enhancement improves compatibility with Cloudflare&apos;s CDN, enabling more use cases that previously failed due to header size limits.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;To learn more and get started, refer to the &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/reference/connection-limits/#request-limits&quot;&gt;Cloudflare Fundamentals documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 16 Oct 2025 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Load Balancing - Monitor Groups for Advanced Health Checking With Load Balancing</title><link>https://developers.cloudflare.com/changelog/post/2025-08-15-monitor-groups-for-load-balancing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-08-15-monitor-groups-for-load-balancing/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;what-you-can-do&quot;&gt;What you can do:&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#what-you-can-do&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Combine Multiple Monitors&lt;/strong&gt;: Group different health monitors (for example, HTTP, TCP) that check various application components, like a primary API gateway and a specific &lt;code&gt;/login&lt;/code&gt; service.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Isolate Monitors for Observation&lt;/strong&gt;: Mark a monitor as &quot;monitoring only&quot; to receive alerts and data without it affecting a pool&apos;s health status or traffic steering. This is perfect for testing new checks or observing non-critical dependencies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improve Steering Intelligence&lt;/strong&gt;: Latency for Dynamic Steering is automatically averaged across all active monitors in a group, providing a more holistic view of an origin&apos;s performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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&apos;s true status.&lt;/p&gt;
&lt;p&gt;For detailed information and API configuration guides, please visit our &lt;a href=&quot;https://developers.cloudflare.com/load-balancing/monitors/monitor-groups&quot;&gt;developer documentation&lt;/a&gt; for Monitor Groups.&lt;/p&gt;</description><pubDate>Thu, 16 Oct 2025 00:00:00 GMT</pubDate><product>Load Balancing</product><category>Load Balancing</category></item><item><title>AI Crawl Control - Enhanced AI Crawl Control metrics with new drilldowns and filters</title><link>https://developers.cloudflare.com/changelog/post/2025-10-14-enhanced-metrics-drilldowns/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-14-enhanced-metrics-drilldowns/</guid><description>&lt;p&gt;AI Crawl Control now provides enhanced metrics and CSV data exports to help you better understand AI crawler activity across your sites.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;track-crawler-requests-over-time&quot;&gt;Track crawler requests over time&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#track-crawler-requests-over-time&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Visualize crawler activity patterns over time, and group data by different dimensions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;By Crawler&lt;/strong&gt; — Track activity from individual AI crawlers (GPTBot, ClaudeBot, Bytespider)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;By Category&lt;/strong&gt; — Analyze crawler purpose or type&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;By Operator&lt;/strong&gt; — Discover which companies (OpenAI, Anthropic, ByteDance) are crawling your site&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;By Host&lt;/strong&gt; — Break down activity across multiple subdomains&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;By Status Code&lt;/strong&gt; — Monitor HTTP response codes to crawlers (200s, 300s, 400s, 500s)&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1293,height=666,format=webp/_astro/ai-crawl-control-requests-over-time.BtRyz0OT.png&quot; alt=&quot;AI Crawl Control requests over time chart with grouping tabs&quot; title=&quot;Interactive chart showing crawler requests over time with filterable dimensions&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1293&quot; height=&quot;666&quot;&gt;&lt;figcaption&gt;Interactive chart showing crawler requests over time with filterable dimensions&lt;/figcaption&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;analyze-referrer-data-paid-plans&quot;&gt;Analyze referrer data (Paid plans)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#analyze-referrer-data-paid-plans&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Identify traffic sources with referrer analytics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;View top referrers driving traffic to your site&lt;/li&gt;
&lt;li&gt;Understand discovery patterns and content popularity from AI operators&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1291,height=656,format=webp/_astro/ai-crawl-control-top-referrers.CEUAwpd8.png&quot; alt=&quot;AI Crawl Control top referrers breakdown&quot; title=&quot;Bar chart showing top referrers and their respective traffic volumes&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1291&quot; height=&quot;656&quot;&gt;&lt;figcaption&gt;Bar chart showing top referrers and their respective traffic volumes&lt;/figcaption&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;export-data&quot;&gt;Export data&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#export-data&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Download your filtered view as a CSV:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Includes all applied filters and groupings&lt;/li&gt;
&lt;li&gt;Useful for custom reporting and deeper analysis&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;get-started&quot;&gt;Get started&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Log in to the Cloudflare dashboard, and select your account and domain.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;AI Crawl Control&lt;/strong&gt; &amp;gt; &lt;strong&gt;Metrics&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use the grouping tabs to explore different views of your data.&lt;/li&gt;
&lt;li&gt;Apply filters to focus on specific crawlers, time ranges, or response codes.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Download CSV&lt;/strong&gt; to export your filtered data for further analysis.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/ai-crawl-control&quot;&gt;AI Crawl Control&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate><product>AI Crawl Control</product><category>AI Crawl Control</category></item><item><title>Cloudflare Fundamentals - Single sign-on now manageable in the user experience</title><link>https://developers.cloudflare.com/changelog/post/2025-10-14-sso-self-service-ux/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-14-sso-self-service-ux/</guid><description>&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1378,height=877,format=webp/_astro/2025-10-14-sso-configuration-ux.DLkIKSax.png&quot; alt=&quot;Screenshot of new user experience for managing SSO&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1378&quot; height=&quot;877&quot;&gt;
&lt;p&gt;During Birthday Week, we announced that &lt;a href=&quot;https://blog.cloudflare.com/enterprise-grade-features-for-all/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;single sign-on (SSO) is available for free&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to everyone who signs in with a custom email domain and maintains a compatible &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;identity provider&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. SSO minimizes user friction around login and provides the strongest security posture available. At the time, this could only be configured using the API.&lt;/p&gt;
&lt;p&gt;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 &lt;strong&gt;Manage account&lt;/strong&gt; &amp;gt; &lt;strong&gt;Members&lt;/strong&gt; &amp;gt; &lt;strong&gt;Settings&lt;/strong&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;for-more-information&quot;&gt;For more information&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#for-more-information&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/dashboard-sso/&quot;&gt;Cloudflare dashboard SSO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 14 Oct 2025 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>WAF - WAF Release - 2025-10-13</title><link>https://developers.cloudflare.com/changelog/post/2025-10-13-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-13-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CVE-2025-59340 — Exploitation enables attacker-supplied type descriptors / Jackson &lt;code&gt;ObjectMapper&lt;/code&gt; abuse, allowing arbitrary class loading, file/URL access (LFI/SSRF primitives) and, with suitable gadget chains, potential remote code execution and system compromise.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;b327d6442e2d4848b4aab3cbc04bab5f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...c04bab5f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;100892&lt;/td&gt;&lt;td&gt;JinJava - SSTI - CVE:CVE-2025-59340&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 13 Oct 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Gateway - New domain categories added</title><link>https://developers.cloudflare.com/changelog/post/2025-10-10-new-domain-categories/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-10-new-domain-categories/</guid><description>&lt;p&gt;We have added three new domain categories under the Technology parent category, to better reflect online content and improve DNS filtering.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New categories added&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parent ID&lt;/th&gt;
&lt;th&gt;Parent Name&lt;/th&gt;
&lt;th&gt;Category ID&lt;/th&gt;
&lt;th&gt;Category Name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;Technology&lt;/td&gt;
&lt;td&gt;194&lt;/td&gt;
&lt;td&gt;Keep Awake Software&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;Technology&lt;/td&gt;
&lt;td&gt;192&lt;/td&gt;
&lt;td&gt;Remote Access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;Technology&lt;/td&gt;
&lt;td&gt;193&lt;/td&gt;
&lt;td&gt;Shareware/Freeware&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;Refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/domain-categories/&quot;&gt;Gateway domain categories&lt;/a&gt; to learn more.&lt;/p&gt;</description><pubDate>Fri, 10 Oct 2025 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category></item><item><title>Workers - Worker startup time limit increased to 1 second</title><link>https://developers.cloudflare.com/changelog/post/2025-10-10-increased-startup-time/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-10-increased-startup-time/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;This allows you to run Workers that import more complex packages and execute more code prior to requests being handled.&lt;/p&gt;
&lt;p&gt;For more information, see the documentation on &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/limits/#worker-startup-time&quot;&gt;Workers startup limits&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 10 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Radar - Expanded CT log activity insights on Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2025-10-09-radar-ct-log-activity-insights/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-09-radar-ct-log-activity-insights/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; has expanded its Certificate Transparency (CT) log insights with new stats that provide greater visibility into log activity:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Log growth rate&lt;/strong&gt;: The average throughput of the CT log over the past 7 days, measured in certificates per hour.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Included certificate count&lt;/strong&gt;: The total number of certificates already included in this CT log.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eligible-for-inclusion certificate count&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Last update&lt;/strong&gt;: The timestamp of the most recent update to the CT log.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These new statistics have been added to the response of the &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/ct/subresources/logs/methods/get/&quot;&gt;Get Certificate Log Details&lt;/a&gt; API endpoint, and are displayed on the &lt;a href=&quot;https://radar.cloudflare.com/certificate-transparency/log/nimbus2025#log-activity&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CT log information page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1598,height=441,format=webp/_astro/ct-log-activity.GHD-K7Mk.png&quot; alt=&quot;Screenshot of the CT log activity card on the CT log information page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1598&quot; height=&quot;441&quot;&gt;</description><pubDate>Thu, 09 Oct 2025 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>Workers - You can now deploy full-stack apps on Workers using Terraform</title><link>https://developers.cloudflare.com/changelog/post/2025-10-09-assets-terraform/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-09-assets-terraform/</guid><description>
&lt;p&gt;You can now upload Workers with &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/&quot;&gt;static assets&lt;/a&gt; (like HTML, CSS, JavaScript, images) with the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Terraform provider v5.11.0&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, making it even easier to deploy and manage full-stack apps with IaC.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Previously&lt;/strong&gt;, you couldn&apos;t use Terraform to upload static assets without writing custom scripts to handle generating an &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/direct-upload/#upload-manifest&quot;&gt;asset manifest&lt;/a&gt;, calling the &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/direct-upload/#upload-static-assets&quot;&gt;Cloudflare API to upload assets in chunks&lt;/a&gt;, and handling change detection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Now&lt;/strong&gt;, you simply define the directory where your assets are built, and we handle the rest. Check out the &lt;a href=&quot;https://developers.cloudflare.com/changelog/#examples&quot;&gt;examples&lt;/a&gt; for what this looks like in Terraform configuration.&lt;/p&gt;
&lt;p&gt;You can get started today with &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;the Cloudflare Terraform provider (v5.11.0)&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, using either the existing &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_script&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_workers_script&lt;/code&gt; resource&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, or the beta &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker_version&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_worker_version&lt;/code&gt; resource&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;examples&quot;&gt;Examples&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#examples&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;with-cloudflare_workers_script&quot;&gt;With &lt;code&gt;cloudflare_workers_script&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#with-cloudflare_workers_script&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Here&apos;s how you can use the existing &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/workers_script&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_workers_script&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; resource to upload your Worker code and assets in one shot.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;hcl&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;hcl&quot; data-nb-lang=&quot;hcl&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;cloudflare_workers_script&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;my_app&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  account_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;account_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  script_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;my-app&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  content_file&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;   =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;./dist/worker/index.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  content_sha256&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; filesha256&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;./dist/worker/index.js&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  main_module&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;index.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;  # Just point to your assets directory - that&apos;s it!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  assets&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    directory &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;./dist/static&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;with-cloudflare_worker-cloudflare_worker_version-and-cloudflare_workers_deployment&quot;&gt;With &lt;code&gt;cloudflare_worker&lt;/code&gt;, &lt;code&gt;cloudflare_worker_version&lt;/code&gt;, and &lt;code&gt;cloudflare_workers_deployment&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#with-cloudflare_worker-cloudflare_worker_version-and-cloudflare_workers_deployment&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;And here&apos;s an example using the beta &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/worker_version&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_worker_version&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; resource, alongside the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_worker&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/workers_deployment&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_workers_deployment&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; resources:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;hcl&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;hcl&quot; data-nb-lang=&quot;hcl&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# This tracks the existence of your Worker, so that you&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# can upload code and assets separately from tracking Worker state.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;cloudflare_worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;my_app&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  account_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;account_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;       =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;my-app&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;cloudflare_worker_version&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;my_app_version&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  account_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;account_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  worker_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; cloudflare_worker&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;my_app&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;  # Just point to your assets directory - that&apos;s it!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  assets&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    directory &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;./dist/static&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  modules&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    name         &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;index.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    content_file &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;./dist/worker/index.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    content_type &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;application/javascript+module&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;cloudflare_workers_deployment&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;my_app_deployment&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  account_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;account_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  script_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; cloudflare_worker&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;my_app&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  strategy&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;percentage&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  versions&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    version_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; cloudflare_worker_version.my_app_version.id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    percentage &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 100&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-changed&quot;&gt;What&apos;s changed&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-changed&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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&apos;s changed and trigger an upload for &lt;em&gt;only&lt;/em&gt; those changed files.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;try-it-out&quot;&gt;Try it out&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#try-it-out&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Get started with &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;the Cloudflare Terraform provider (v5.11.0)&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;You can use either the existing &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_script&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_workers_script&lt;/code&gt; resource&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to upload your Worker code and assets in one resource.&lt;/li&gt;
&lt;li&gt;Or you can use the new beta &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker_version&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_worker_version&lt;/code&gt; resource&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; (along with the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_worker&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/workers_deployment&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_workers_deployment&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;) resources to more granularly control the lifecycle of each Worker resource.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 09 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - You can now deploy and manage Workflows in Terraform</title><link>https://developers.cloudflare.com/changelog/post/2025-10-09-workflows-terraform/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-09-workflows-terraform/</guid><description>&lt;p&gt;You can now create and manage &lt;a href=&quot;https://developers.cloudflare.com/workflows/&quot;&gt;Workflows&lt;/a&gt; using Terraform, now supported in the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workflow&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Terraform provider v5.11.0&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. Workflows allow you to build durable, multi-step applications -- without needing to worry about retrying failed tasks or managing infrastructure.&lt;/p&gt;
&lt;p&gt;Now, you can deploy and manage Workflows through Terraform using the new &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workflow&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_workflow&lt;/code&gt; resource&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;hcl&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;hcl&quot; data-nb-lang=&quot;hcl&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;cloudflare_workflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;my_workflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  account_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;account_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  workflow_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;my-workflow&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  class_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;MyWorkflow&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  script_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;   =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;my-worker&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;examples&quot;&gt;Examples&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#examples&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Here are full examples of how to configure &lt;code&gt;cloudflare_workflow&lt;/code&gt; in Terraform, using the existing &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_script&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_workers_script&lt;/code&gt; resource&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, and the beta &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker_version&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_worker_version&lt;/code&gt; resource&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;with-cloudflare_workflow-and-cloudflare_workers_script&quot;&gt;With &lt;code&gt;cloudflare_workflow&lt;/code&gt; and &lt;code&gt;cloudflare_workers_script&lt;/code&gt;&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#with-cloudflare_workflow-and-cloudflare_workers_script&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;hcl&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;hcl&quot; data-nb-lang=&quot;hcl&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;cloudflare_workers_script&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;workflow_worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  account_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;cloudflare_account_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  script_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;my-workflow-worker&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  content_file&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;   =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/../dist/worker/index.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  content_sha256&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; filesha256&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/../dist/worker/index.js&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  main_module&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;index.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;cloudflare_workflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;workflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  account_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;cloudflare_account_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  workflow_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;my-workflow&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  class_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;MyWorkflow&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  script_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;   =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; cloudflare_workers_script&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;workflow_worker&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;script_name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;with-cloudflare_workflow-and-the-new-beta-resources&quot;&gt;With &lt;code&gt;cloudflare_workflow&lt;/code&gt;, and the new beta resources&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#with-cloudflare_workflow-and-the-new-beta-resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;You can more granularly control the lifecycle of each Worker resource using the beta &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/worker_version&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_worker_version&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; resource, alongside the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_worker&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs/resources/workers_deployment&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_workers_deployment&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; resources.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;hcl&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;hcl&quot; data-nb-lang=&quot;hcl&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;cloudflare_worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;workflow_worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  account_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;cloudflare_account_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;       =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;my-workflow-worker&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;cloudflare_worker_version&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;workflow_worker_version&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  account_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;cloudflare_account_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  worker_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; cloudflare_worker&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;workflow_worker&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  main_module&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;         =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;index.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  modules&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    name         &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;index.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    content_file &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/../dist/worker/index.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    content_type &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;application/javascript+module&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;cloudflare_workers_deployment&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;workflow_deployment&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  account_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;cloudflare_account_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  script_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; cloudflare_worker&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;workflow_worker&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  strategy&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;percentage&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  versions&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    version_id &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; cloudflare_worker_version.workflow_worker_version.id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    percentage &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 100&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;resource&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;cloudflare_workflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; &quot;my_workflow&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  account_id&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; var&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;cloudflare_account_id&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  workflow_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;my-workflow&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  class_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;MyWorkflow&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  script_name&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;   =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; cloudflare_worker&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;workflow_worker&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;try-it-out&quot;&gt;Try it out&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#try-it-out&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Get started with &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/5.11.0/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;the Cloudflare Terraform provider (v5.11.0)&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and the new &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workflow&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_workflow&lt;/code&gt; resource&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 09 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare One Client - WARP client for Linux (version 2025.8.779.0)</title><link>https://developers.cloudflare.com/changelog/post/2025-10-07-warp-linux-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-07-warp-linux-ga/</guid><description>&lt;p&gt;A new GA release for the Linux WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://pkg.cloudflareclient.com/&quot;&gt;pkg.cloudflareclient.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode&quot;&gt;Proxy mode&lt;/a&gt; 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&amp;#39;s network. This has more than doubled Proxy mode throughput in lab speed testing, by an order of magnitude in some cases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The MASQUE protocol is now the only protocol that can use &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode&quot;&gt;Proxy mode&lt;/a&gt;. 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.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server&quot;&gt;Route traffic to fallback server&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 07 Oct 2025 19:20:00 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - WARP client for Windows (version 2025.8.779.0)</title><link>https://developers.cloudflare.com/changelog/post/2025-10-07-warp-windows-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-07-warp-windows-ga/</guid><description>&lt;p&gt;A new GA release for the Windows WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains significant fixes and improvements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode&quot;&gt;Proxy mode&lt;/a&gt; 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&amp;#39;s network. This has more than doubled Proxy mode throughput in lab speed testing, by an order of magnitude in some cases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The MASQUE protocol is now the only protocol that can use &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode&quot;&gt;Proxy mode&lt;/a&gt;. 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.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd&quot;&gt;Windows 11 24H2 KB5062553&lt;/a&gt; or higher for resolution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server&quot;&gt;Route traffic to fallback server&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Devices with KB5055523 installed may receive a warning about &lt;code&gt;Win32/ClickFix.ABA&lt;/code&gt; being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to &lt;a href=&quot;https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0&quot;&gt;version 1.429.19.0&lt;/a&gt; or later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS resolution may be broken when the following conditions are all true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.&lt;/li&gt;
&lt;li&gt;A custom DNS server address is configured on the primary network adapter.&lt;/li&gt;
&lt;li&gt;The custom DNS server address on the primary network adapter is changed while WARP is connected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To work around this issue, reconnect the WARP client by toggling off and back on.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 07 Oct 2025 17:02:40 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - WARP client for macOS (version 2025.8.779.0)</title><link>https://developers.cloudflare.com/changelog/post/2025-10-07-warp-macos-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-07-warp-macos-ga/</guid><description>&lt;p&gt;A new GA release for the macOS WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains significant fixes and improvements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode&quot;&gt;Proxy mode&lt;/a&gt; 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&amp;#39;s network. This has more than doubled Proxy mode throughput in lab speed testing, by an order of magnitude in some cases.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The MASQUE protocol is now the only protocol that can use &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode&quot;&gt;Proxy mode&lt;/a&gt;. 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.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server&quot;&gt;Route traffic to fallback server&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 07 Oct 2025 17:02:40 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare Fundamentals - Automated reminders for backup codes</title><link>https://developers.cloudflare.com/changelog/post/2025-10-07-recovery-codes/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-07-recovery-codes/</guid><description>&lt;p&gt;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 &lt;strong&gt;Profile&lt;/strong&gt; &amp;gt; &lt;strong&gt;Security &amp;amp; Authentication&lt;/strong&gt; &amp;gt; &lt;strong&gt;Backup codes&lt;/strong&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;sign-in-security-best-practices&quot;&gt;Sign-in security best practices&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#sign-in-security-best-practices&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Use 2FA to make it harder for an attacker to get into your account in the event your password is leaked&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;If you use an app to manage your 2FA keys, enable cloud backup, so that you don&apos;t lose your keys in the event you lose your phone.&lt;/li&gt;
&lt;li&gt;If you use a custom email domain to sign in, &lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/dashboard-sso/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;configure SSO&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;If you manage a Cloudflare account for work:
&lt;ul&gt;
&lt;li&gt;Have at least two administrators in case one of them unexpectedly leaves your company&lt;/li&gt;
&lt;li&gt;Use SCIM to automate permissions management for members in your Cloudflare account&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 07 Oct 2025 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>WAF - WAF Release - 2025-10-07 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2025-10-07-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-07-emergency-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;12f808a5315441688f3b7c8a3a4d1bd6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...3a4d1bd6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;100788B&lt;/td&gt;&lt;td&gt;Cisco Secure Firewall Adaptive Security Appliance - Remote Code Execution - CVE:CVE-2025-20333, CVE:CVE-2025-20362, CVE:CVE-2025-20363&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Tue, 07 Oct 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - New Overview Page for Cloudflare Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-10-06-new-worker-overview-page/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-06-new-worker-overview-page/</guid><description>&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=1016,format=webp/_astro/workers-overview.BM_exs4R.png&quot; alt=&quot;Screenshot of the Workers overview page in the Cloudflare dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1800&quot; height=&quot;1016&quot;&gt;
&lt;p&gt;Each of your Workers now has a new overview page in the Cloudflare dashboard.&lt;/p&gt;
&lt;p&gt;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&apos;s going on.&lt;/p&gt;
&lt;p&gt;It&apos;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.&lt;/p&gt;
&lt;p&gt;Navigation is also simpler, with visually distinct tabs at the top of the page. At the bottom right you&apos;ll find guided steps for what to do next that are based on the state of your Worker, such as adding a &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/&quot;&gt;binding&lt;/a&gt; or connecting a custom domain.&lt;/p&gt;
&lt;p&gt;We plan to add more here over time. Better insights, more controls, and ways to manage your Worker from one page.&lt;/p&gt;
&lt;p&gt;If you have feedback or suggestions for the new Overview page or your Cloudflare Workers experience in general, we&apos;d love to hear from you. Join the Cloudflare developer community on &lt;a href=&quot;https://discord.com/channels/595317990191398933/1064502845061210152&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Discord&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 07 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>R2, R2 Data Catalog - R2 Data Catalog table-level compaction</title><link>https://developers.cloudflare.com/changelog/post/2025-10-06-data-catalog-table-compaction/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-06-data-catalog-table-compaction/</guid><description>&lt;p&gt;You can now enable compaction for individual &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables in &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;, giving you fine-grained control over different workloads.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Enable compaction for a specific table (no token required)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; bucket&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; catalog&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; compaction&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; enable&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;BUCKE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;NAMESPAC&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;TABL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --target-size&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 256&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;This allows you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apply different target file sizes per table&lt;/li&gt;
&lt;li&gt;Disable compaction for specific tables&lt;/li&gt;
&lt;li&gt;Optimize based on table-specific access patterns&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Learn more at &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/manage-catalogs/&quot;&gt;Manage catalogs&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 06 Oct 2025 00:00:00 GMT</pubDate><product>R2</product><category>R2</category><category>R2 Data Catalog</category></item><item><title>Radar - Browser Support Detection for PQ Encryption on Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2025-10-06-radar-pq-encryption-test/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-06-radar-pq-encryption-test/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; now includes browser detection for Post-quantum (PQ) encryption.
The &lt;a href=&quot;https://radar.cloudflare.com/adoption-and-usage#post-quantum-encryption&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Post-quantum encryption card&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; now checks whether a user’s browser supports post-quantum encryption.
If support is detected, information about the key agreement in use is displayed.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=872,height=109,format=webp/_astro/pq-encryption-test.gx_uoaMX.png&quot; alt=&quot;Screenshot of the PQ encryption browser support test on the Adoption &amp;amp; Usage page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;872&quot; height=&quot;109&quot;&gt;</description><pubDate>Mon, 06 Oct 2025 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>WAF - WAF Release - 2025-10-06</title><link>https://developers.cloudflare.com/changelog/post/2025-10-06-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-06-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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 (&lt;code&gt;cleanTcs&lt;/code&gt;, &lt;code&gt;killProcesses&lt;/code&gt;, &lt;code&gt;cleanIptables&lt;/code&gt;) are vulnerable to OS command injection.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Form-Data (CVE-2025-7783): Attackers who can observe &lt;code&gt;Math.random()&lt;/code&gt; outputs and control request fields in form-data may exploit this flaw to perform HTTP parameter pollution, leading to request tampering or data manipulation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Two new generic SQLi detections added to enhance baseline coverage against inline-comment obfuscation and information disclosure attempts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CVE-2025-7783 — Predictable multipart boundaries in form-data enabling HTTP Parameter Pollution; results include request tampering, parameter overwrite, and downstream data integrity loss.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;0c9bf31ab6fa41fc8f12daaf8650f52f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8650f52f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;100882&lt;/td&gt;&lt;td&gt;Chaos Mesh - Missing Authentication - CVE:CVE-2025-59358&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;5d459ed434ed446c9580c73c2b8c3680&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...2b8c3680&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100883&lt;/td&gt;&lt;td&gt;Chaos Mesh - Command Injection - CVE:CVE-2025-59359&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;a2591ba5befa4815a6861aefef859a04&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ef859a04&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100884&lt;/td&gt;&lt;td&gt;Chaos Mesh - Command Injection - CVE:CVE-2025-59361&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;05eea4fabf6f4cf3aac1094b961f26a7&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...961f26a7&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100886&lt;/td&gt;&lt;td&gt;Form-Data - Parameter Pollution - CVE:CVE-2025-7783&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;90514c7810694b188f56979826a4074c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...26a4074c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100888&lt;/td&gt;&lt;td&gt;Chaos Mesh - Command Injection - CVE:CVE-2025-59360&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;42fbc8c09ec84578b9633ffc31101b2f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...31101b2f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100916&lt;/td&gt;&lt;td&gt;Oracle E-Business Suite - Remote Code Execution - CVE:CVE-2025-61882&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;badc687a3ba3420a844220b129aa43c3&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...29aa43c3&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100917&lt;/td&gt;&lt;td&gt;Generic Rules - SQLi - Inline Comment Injection&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;28fa27511f29428899ceb5a273c10b6f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...73c10b6f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100918&lt;/td&gt;&lt;td&gt;Generic Rules - SQLi - Information Disclosure&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 06 Oct 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>WAF - WAF Release - 2025-10-03</title><link>https://developers.cloudflare.com/changelog/post/2025-10-03-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-03-waf-release/</guid><description>
&lt;p&gt;&lt;strong&gt;Managed Ruleset Updated&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;0d02c2fb14eb4cec9c2e2b58d61fac74&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d61fac74&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;100902&lt;/td&gt;&lt;td&gt;Generic Rules - Command Execution - 2&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;c3079865ce9a41368657026b514aeeb8&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...514aeeb8&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100908&lt;/td&gt;&lt;td&gt;Generic Rules - Command Execution - 3&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;107ae2922b654bb28df7ca978d46a6f4&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8d46a6f4&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100910&lt;/td&gt;&lt;td&gt;Generic Rules - Command Execution - 4&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;68bdb75ae6d24e139a83e5731bd0a329&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...1bd0a329&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100915&lt;/td&gt;&lt;td&gt;Generic Rules - Command Execution - 5&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ea04bb580f7d400386c7dc1d5e51450a&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...5e51450a&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100899&lt;/td&gt;&lt;td&gt;Generic Rules - Content-Type Abuse&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;233364f656ff42b8acc41dcd7996012f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...7996012f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100914&lt;/td&gt;&lt;td&gt;Generic Rules - Content-Type Injection&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;1aa695281c954513be3d003b93209312&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...93209312&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100911&lt;/td&gt;&lt;td&gt;Generic Rules - Cookie Header Injection&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;d9f9e4f5bf11489da52dccb40f373b3f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...0f373b3f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100905&lt;/td&gt;&lt;td&gt;Generic Rules - NoSQL Injection&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;5a1897b714e044a887c0f3f078a0ed04&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...78a0ed04&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100913&lt;/td&gt;&lt;td&gt;Generic Rules - NoSQL Injection - 2&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;4d6fd28df4f1494e95e70d2c5d649624&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...5d649624&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100907&lt;/td&gt;&lt;td&gt;Generic Rules - Parameter Pollution&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;61181e3af5304f7396c7d01cfd1c674e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...fd1c674e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100906&lt;/td&gt;&lt;td&gt;Generic Rules - PHP Object Injection&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ed5190bfbe1b45a6a645126334c88168&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...34c88168&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100904&lt;/td&gt;&lt;td&gt;Generic Rules - Prototype Pollution&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;3ec33bc5ac77495a9f55020e3ab43f7e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...3ab43f7e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100897&lt;/td&gt;&lt;td&gt;Generic Rules - Prototype Pollution 2&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;c6d752c4909e4b7e8eff6c780d94ee22&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...0d94ee22&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100903&lt;/td&gt;&lt;td&gt;Generic Rules - Reverse Shell&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;caf37e7800bb4635bcc2eefcd5add8e3&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d5add8e3&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100909&lt;/td&gt;&lt;td&gt;Generic Rules - Reverse Shell - 2&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;475d090baead467c88dfabbb565c78b0&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...565c78b0&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100898&lt;/td&gt;&lt;td&gt;Generic Rules - SSJI NoSQL&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;f4c7f98934264c9c937eec1212b837a0&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...12b837a0&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100896&lt;/td&gt;&lt;td&gt;Generic Rules - SSRF&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;efd01b814d144e90b36522b311c4fb00&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...11c4fb00&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100895&lt;/td&gt;&lt;td&gt;Generic Rules - Template Injection&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;00a9a0d663da4add95b863abd3ed0123&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d3ed0123&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100895A&lt;/td&gt;&lt;td&gt;Generic Rules - Template Injection - 2&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;e58c0fffee4f4374bd37f2577501a1d9&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...7501a1d9&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100912&lt;/td&gt;&lt;td&gt;Generic Rules - XXE&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ab09ba8d00eb4cdbb7a6a65ddc55cdb6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...dc55cdb6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100900&lt;/td&gt;&lt;td&gt;Relative Paths - Anomaly Headers&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - One-click Cloudflare Access for Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-10-03-one-click-access-for-workers/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-03-one-click-access-for-workers/</guid><description>
&lt;p&gt;You can now enable &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/&quot;&gt;Cloudflare Access&lt;/a&gt; for your &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/routing/workers-dev/&quot;&gt;&lt;code&gt;workers.dev&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/&quot;&gt;Preview URLs&lt;/a&gt; in a single click.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1800,height=1016,format=webp/_astro/workers-access.DGGYThLx.png&quot; alt=&quot;Screenshot of the Enable/Disable Cloudflare Access button on the workers.dev route settings page&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1800&quot; height=&quot;1016&quot;&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/&quot;&gt;Access policy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To enable Cloudflare Access:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;
&lt;p&gt;In the Cloudflare dashboard, go to the &lt;strong&gt;Workers &amp;amp; Pages&lt;/strong&gt; page.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/workers-and-pages&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Workers &amp;amp; Pages&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;strong&gt;Overview&lt;/strong&gt;, select your Worker.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Domains &amp;amp; Routes&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For &lt;code&gt;workers.dev&lt;/code&gt; or Preview URLs, click &lt;strong&gt;Enable Cloudflare Access&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optionally, to configure the Access application, click &lt;strong&gt;Manage Cloudflare Access&lt;/strong&gt;. There, you can change the email addresses you want to authorize. View &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/#selectors&quot;&gt;Access policies&lt;/a&gt; to learn about configuring alternate rules.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To fully secure your application, it is important that you validate the JWT that Cloudflare Access adds to the &lt;code&gt;Cf-Access-Jwt-Assertion&lt;/code&gt; header on the incoming request.&lt;/p&gt;
&lt;p&gt;The following code will validate the JWT using the &lt;a href=&quot;https://www.npmjs.com/package/jose&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;jose NPM package&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { jwtVerify, createRemoteJWKSet } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;jose&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Verify the POLICY_AUD environment variable is set&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;POLICY_AUD&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Missing required audience&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				status: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;403&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				headers: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text/plain&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Get the JWT from the request headers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; token&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; request.headers.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;cf-access-jwt-assertion&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Check if token exists&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;token) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Missing required CF Access JWT&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				status: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;403&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				headers: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text/plain&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		try&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;			// Create JWKS from your team domain&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; JWKS&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createRemoteJWKSet&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;				new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; URL&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;TEAM_DOMAIN&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}/cdn-cgi/access/certs`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;			// Verify the JWT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; jwtVerify&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(token, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;JWKS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				issuer: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;TEAM_DOMAIN&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				audience: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;POLICY_AUD&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;			// Token is valid, proceed with your application logic&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Hello ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;authenticated user&quot;}!`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				headers: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text/plain&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (error) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;			// Token verification failed&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;`Invalid token: ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				status: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;403&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;				headers: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text/plain&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;required-environment-variables&quot;&gt;Required environment variables&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#required-environment-variables&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Add these &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/environment-variables/&quot;&gt;environment variables&lt;/a&gt; to your Worker:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;POLICY_AUD&lt;/code&gt;: Your application&apos;s AUD tag&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TEAM_DOMAIN&lt;/code&gt;: &lt;code&gt;https://&amp;lt;your-team-name&amp;gt;.cloudflareaccess.com&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both of these appear in the modal that appears when you enable Cloudflare Access.&lt;/p&gt;
&lt;p&gt;You can set these variables by adding them to your Worker&apos;s &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/&quot;&gt;Wrangler configuration file&lt;/a&gt;, or via the Cloudflare dashboard under &lt;strong&gt;Workers &amp;amp; Pages&lt;/strong&gt; &amp;gt; &lt;strong&gt;your-worker&lt;/strong&gt; &amp;gt; &lt;strong&gt;Settings&lt;/strong&gt; &amp;gt; &lt;strong&gt;Environment Variables&lt;/strong&gt;.&lt;/p&gt;</description><pubDate>Fri, 03 Oct 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare Fundamentals, Access - Fine-grained Permissioning for Access for Apps, IdPs, &amp; Targets now in Public Beta</title><link>https://developers.cloudflare.com/changelog/post/2025-10-01-fine-grained-permissioning-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-01-fine-grained-permissioning-beta/</guid><description>
&lt;p&gt;Fine-grained permissions for &lt;strong&gt;Access Applications, Identity Providers (IdPs), and Targets&lt;/strong&gt; is now available in Public Beta. This expands our RBAC model beyond account &amp;amp; zone-scoped roles, enabling administrators to grant permissions scoped to individual resources.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s New&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Access Applications&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;: Grant admin permissions to specific Access Applications.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/integrations/identity-providers/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Identity Providers&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;: Grant admin permissions to individual Identity Providers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/applications/non-http/infrastructure-apps/#1-add-a-target&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Targets&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt;: Grant admin rights to specific Targets&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;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&quot; alt=&quot;Updated Permissions Policy UX&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;3004&quot; height=&quot;1410&quot;&gt;&lt;aside role=&quot;note&quot; aria-label=&quot;Note&quot; class=&quot;aside-card flex items-start gap-3 rounded-lg px-4 py-3 my-4&quot; style=&quot;--_c: var(--nb-info); --_t: var(--nb-info-muted);&quot; data-astro-cid-znle5jil&gt;&lt;span class=&quot;flex h-[1.375em] shrink-0 items-center&quot; aria-hidden=&quot;true&quot; data-astro-cid-znle5jil&gt;&lt;svg width=&quot;1em&quot; height=&quot;1em&quot; viewBox=&quot;0 0 256 256&quot; class=&quot;h-[1em] w-[1em]&quot; data-astro-cid-znle5jil=&quot;true&quot; data-icon=&quot;ph:info&quot;&gt;&lt;path fill=&quot;currentColor&quot; d=&quot;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&quot;/&gt;&lt;/svg&gt;&lt;/span&gt;&lt;div class=&quot;flex min-w-0 flex-1 flex-col gap-0.5&quot; data-astro-cid-znle5jil&gt;&lt;p class=&quot;m-0 text-base leading-snug font-semibold&quot; data-astro-cid-znle5jil&gt;Note&lt;/p&gt;&lt;div class=&quot;aside-card-body text-sm leading-normal&quot; data-astro-cid-znle5jil&gt;&lt;p&gt;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.&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Account Read Only&lt;/strong&gt; plus a fine-grained permission for a specific App, IdP, or Target&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Zero Trust Read Only&lt;/strong&gt; plus fine-grained permission for a specific App, IdP, or Target&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;p&gt;For more info:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/roles/&quot;&gt;Get started with Cloudflare Permissioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/manage&quot;&gt;Manage Member Permissioning via the UI &amp;amp; API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category><category>Access</category></item><item><title>Workers AI - New Deepgram Flux model available on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2025-10-02-deepgram-flux/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-02-deepgram-flux/</guid><description>&lt;p&gt;Deepgram&apos;s newest Flux model &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/flux/&quot;&gt;&lt;code&gt;@cf/deepgram/flux&lt;/code&gt;&lt;/a&gt; is now available on Workers AI, hosted directly on Cloudflare&apos;s infrastructure. We&apos;re excited to be a launch partner with Deepgram and offer their new Speech Recognition model built specifically for enabling voice agents. Check out &lt;a href=&quot;https://deepgram.com/flux&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Deepgram&apos;s blog&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; for more details on the release.&lt;/p&gt;
&lt;p&gt;The Flux model can be used in conjunction with Deepgram&apos;s speech-to-text model &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/nova-3/&quot;&gt;&lt;code&gt;@cf/deepgram/nova-3&lt;/code&gt;&lt;/a&gt; and text-to-speech model &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/aura-1/&quot;&gt;&lt;code&gt;@cf/deepgram/aura-1&lt;/code&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;promotional-pricing&quot;&gt;Promotional Pricing&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#promotional-pricing&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;For the month of October 2025, Deepgram&apos;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 &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/flux/&quot;&gt;model page&lt;/a&gt; for pricing details in the future.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-usage&quot;&gt;Example Usage&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-usage&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The new Flux model is WebSocket only as it requires live bi-directional streaming in order to recognize speech activity.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a worker that establishes a websocket connection with &lt;code&gt;@cf/deepgram/flux&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Promise&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; resp&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/deepgram/flux&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      encoding: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;linear16&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      sample_rate: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;16000&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    }, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      websocket: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; resp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ExportedHandler&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Deploy your worker&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;Write a client script to connect to your worker and start sending random audio bytes to it&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; ws&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WebSocket&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;wss://&amp;lt;your-worker-url.com&amp;gt;&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ws.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;onopen&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;Connected to WebSocket&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;  // Generate and send random audio bytes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;  // You can replace this part with a function&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;  // that reads from your mic or other audio source&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; audioData&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; generateRandomAudio&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  ws.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(audioData);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;Audio data sent&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ws.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;onmessage&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;  // Transcription will be received here&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;  // Add your custom logic to parse the data&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;Received:&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, event.data);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ws.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;onerror&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;WebSocket error:&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, error);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;ws.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;onclose&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;WebSocket closed&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Generate random audio data (1 second of noise at 44.1kHz, mono)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; generateRandomAudio&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; sampleRate&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 44100&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; duration&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; numSamples&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; sampleRate &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; duration;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; buffer&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; ArrayBuffer&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(numSamples &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; view&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Int16Array&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(buffer);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  for&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; i &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;; i &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; numSamples; i&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    view[i] &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Math.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;floor&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(Math.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;random&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;() &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 65536&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 32768&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  return&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; buffer;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>Workers Analytics Engine, Workers - Workers Analytics Engine adds supports for new SQL functions</title><link>https://developers.cloudflare.com/changelog/post/2025-09-26-analytics-engine-sql-enhancements/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-26-analytics-engine-sql-enhancements/</guid><description>&lt;p&gt;You can now perform more powerful queries directly in &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Workers Analytics Engine&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; with a major expansion of our SQL function library.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Today, we&apos;ve expanded Workers Analytics Engine&apos;s SQL capabilities with several new functions:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/aggregate-functions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;New aggregate functions:&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;argMin()&lt;/code&gt; - Returns the value associated with the minimum in a group&lt;/li&gt;
&lt;li&gt;&lt;code&gt;argMax()&lt;/code&gt; - Returns the value associated with the maximum in a group&lt;/li&gt;
&lt;li&gt;&lt;code&gt;topK()&lt;/code&gt; - Returns an array of the most frequent values in a group&lt;/li&gt;
&lt;li&gt;&lt;code&gt;topKWeighted()&lt;/code&gt; - Returns an array of the most frequent values in a group using weights&lt;/li&gt;
&lt;li&gt;&lt;code&gt;first_value()&lt;/code&gt; - Returns the first value in an ordered set of values within a partition&lt;/li&gt;
&lt;li&gt;&lt;code&gt;last_value()&lt;/code&gt; - Returns the last value in an ordered set of values within a partition&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/bit-functions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;New bit functions:&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bitAnd()&lt;/code&gt; - Returns the bitwise AND of two expressions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitCount()&lt;/code&gt; - Returns the number of bits set to one in the binary representation of a number&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitHammingDistance()&lt;/code&gt; - Returns the number of bits that differ between two numbers&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitNot()&lt;/code&gt; - Returns a number with all bits flipped&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitOr()&lt;/code&gt; - Returns the inclusive bitwise OR of two expressions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitRotateLeft()&lt;/code&gt; - Rotates all bits in a number left by specified positions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitRotateRight()&lt;/code&gt; - Rotates all bits in a number right by specified positions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitShiftLeft()&lt;/code&gt; - Shifts all bits in a number left by specified positions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitShiftRight()&lt;/code&gt; - Shifts all bits in a number right by specified positions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitTest()&lt;/code&gt; - Returns the value of a specific bit in a number&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bitXor()&lt;/code&gt; - Returns the bitwise exclusive-or of two expressions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/mathematical-functions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;New mathematical functions:&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;abs()&lt;/code&gt; - Returns the absolute value of a number&lt;/li&gt;
&lt;li&gt;&lt;code&gt;log()&lt;/code&gt; - Computes the natural logarithm of a number&lt;/li&gt;
&lt;li&gt;&lt;code&gt;round()&lt;/code&gt; - Rounds a number to a specified number of decimal places&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ceil()&lt;/code&gt; - Rounds a number up to the nearest integer&lt;/li&gt;
&lt;li&gt;&lt;code&gt;floor()&lt;/code&gt; - Rounds a number down to the nearest integer&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pow()&lt;/code&gt; - Returns a number raised to the power of another number&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/string-functions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;New string functions:&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lowerUTF8()&lt;/code&gt; - Converts a string to lowercase using UTF-8 encoding&lt;/li&gt;
&lt;li&gt;&lt;code&gt;upperUTF8()&lt;/code&gt; - Converts a string to uppercase using UTF-8 encoding&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/encoding-functions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;New encoding functions:&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hex()&lt;/code&gt; - Converts a number to its hexadecimal representation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bin()&lt;/code&gt; - Converts a string to its binary representation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/type-conversion-functions/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;New type conversion functions:&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;toUInt8()&lt;/code&gt; - Converts any numeric expression, or expression resulting in a string representation of a decimal, into an unsigned 8 bit integer&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;ready-to-get-started&quot;&gt;Ready to get started?&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#ready-to-get-started&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Whether you&apos;re building usage-based billing systems, customer analytics dashboards, or other custom analytics, these functions let you get the most out of your data. &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/get-started/&quot;&gt;Get started &lt;/a&gt; with Workers Analytics Engine and explore all available functions in our &lt;a href=&quot;https://developers.cloudflare.com/analytics/analytics-engine/sql-reference/&quot;&gt;SQL reference documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 02 Oct 2025 00:00:00 GMT</pubDate><product>Workers Analytics Engine</product><category>Workers Analytics Engine</category><category>Workers</category></item><item><title>Analytics - New Confidence Intervals in GraphQL Analytics API</title><link>https://developers.cloudflare.com/changelog/post/2025-10-01-confidence-intervals/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-01-confidence-intervals/</guid><description>&lt;p&gt;The GraphQL Analytics API now supports confidence intervals for &lt;code&gt;sum&lt;/code&gt; and &lt;code&gt;count&lt;/code&gt; fields on adaptive (sampled) datasets. Confidence intervals provide a statistical range around sampled results, helping verify accuracy and quantify uncertainty.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Supported datasets&lt;/strong&gt;: Adaptive (sampled) datasets only.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supported fields&lt;/strong&gt;: All &lt;code&gt;sum&lt;/code&gt; and &lt;code&gt;count&lt;/code&gt; fields.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usage&lt;/strong&gt;: The confidence &lt;code&gt;level&lt;/code&gt; must be provided as a decimal between 0 and 1 (e.g. &lt;code&gt;0.90&lt;/code&gt;, &lt;code&gt;0.95&lt;/code&gt;, &lt;code&gt;0.99&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Default&lt;/strong&gt;: If no confidence level is specified, no intervals are returned.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For examples and more details, see the &lt;a href=&quot;https://developers.cloudflare.com/analytics/graphql-api/features/confidence-intervals/&quot;&gt;GraphQL Analytics API documentation&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate><product>Analytics</product><category>Analytics</category></item><item><title>Containers - Larger Container instance types</title><link>https://developers.cloudflare.com/changelog/post/2025-10-01-new-container-instance-types/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-01-new-container-instance-types/</guid><description>&lt;p&gt;New instance types provide up to 4 vCPU, 12 GiB of memory, and 20 GB of disk per container instance.&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instance Type&lt;/th&gt;
&lt;th&gt;vCPU&lt;/th&gt;
&lt;th&gt;Memory&lt;/th&gt;
&lt;th&gt;Disk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;lite&lt;/td&gt;
&lt;td&gt;1/16&lt;/td&gt;
&lt;td&gt;256 MiB&lt;/td&gt;
&lt;td&gt;2 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;basic&lt;/td&gt;
&lt;td&gt;1/4&lt;/td&gt;
&lt;td&gt;1 GiB&lt;/td&gt;
&lt;td&gt;4 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standard-1&lt;/td&gt;
&lt;td&gt;1/2&lt;/td&gt;
&lt;td&gt;4 GiB&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standard-2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;6 GiB&lt;/td&gt;
&lt;td&gt;12 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standard-3&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8 GiB&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;standard-4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;12 GiB&lt;/td&gt;
&lt;td&gt;20 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The &lt;code&gt;dev&lt;/code&gt; and &lt;code&gt;standard&lt;/code&gt; instance types are preserved for backward compatibility and are aliases for &lt;code&gt;lite&lt;/code&gt; and &lt;code&gt;standard-1&lt;/code&gt;, respectively. The &lt;code&gt;standard-1&lt;/code&gt; instance type now provides up to 8 GB of disk instead of only 4 GB.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/containers/get-started/&quot;&gt;getting started guide&lt;/a&gt; to deploy your first Container,
and the &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/limits/&quot;&gt;limits documentation&lt;/a&gt; for more details on the available instance types and limits.&lt;/p&gt;</description><pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Data Loss Prevention - Expanded File Type Controls for Executables and Disk Images</title><link>https://developers.cloudflare.com/changelog/post/2025-10-01-new-file-type-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-01-new-file-type-support/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;We have expanded Gateway&apos;s file type controls to include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apple Disk Image (dmg)&lt;/li&gt;
&lt;li&gt;Microsoft Software Installer (msix, appx)&lt;/li&gt;
&lt;li&gt;Apple Software Package (pkg)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can find these new options within the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/#download-and-upload-file-types&quot;&gt;&lt;em&gt;Upload File Types&lt;/em&gt; and &lt;em&gt;Download File Types&lt;/em&gt; selectors&lt;/a&gt; when creating or editing an HTTP policy. The file types are categorized as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;System&lt;/strong&gt;: &lt;em&gt;Apple Disk Image (dmg)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Executable&lt;/strong&gt;: &lt;em&gt;Microsoft Software Installer (msix)&lt;/em&gt;, &lt;em&gt;Microsoft Software Installer (appx)&lt;/em&gt;, &lt;em&gt;Apple Software Package (pkg)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To ensure these file types are blocked effectively, please note the following behaviors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DMG: Due to their file structure, DMG files are blocked at the very end of the transfer. A user&apos;s download may appear to progress but will fail at the last moment, preventing the browser from saving the file.&lt;/li&gt;
&lt;li&gt;MSIX: To comprehensively block Microsoft Software Installers, you should also include the file type &lt;em&gt;Unscannable&lt;/em&gt;. MSIX files larger than 100 MB are identified as Unscannable ZIP files during inspection.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started, go to your HTTP policies in Zero Trust. For a full list of file types, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/#supported-file-types&quot;&gt;supported file types&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate><product>Data Loss Prevention</product><category>Data Loss Prevention</category></item><item><title>Cloudflare Fundamentals - Return markdown</title><link>https://developers.cloudflare.com/changelog/post/2025-10-01-md-returned/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-10-01-md-returned/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; https://developers.cloudflare.com/workers/&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;Accept: text/markdown&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  -v&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;If you maintain your own site and want to adopt this practice using Cloudflare Workers for your own users you can follow the example &lt;a href=&quot;https://github.com/cloudflare/cloudflare-docs/pull/25493&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;here&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Wed, 01 Oct 2025 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Cloudflare One Client - WARP client for Windows (version 2025.7.176.0)</title><link>https://developers.cloudflare.com/changelog/post/2025-09-30-warp-windows-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-30-warp-windows-ga/</guid><description>&lt;p&gt;A new GA release for the Windows WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes and improvements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MASQUE is now the default &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#device-tunnel-protocol&quot;&gt;tunnel protocol&lt;/a&gt; for all new WARP device profiles.&lt;/li&gt;
&lt;li&gt;Improvement to limit idle connections in &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#dns-only-mode&quot;&gt;Gateway with DoH mode&lt;/a&gt; to avoid unnecessary resource usage that can lead to DoH requests not resolving.&lt;/li&gt;
&lt;li&gt;Improvement to maintain TCP connections to reduce interruptions in long-lived connections such as RDP or SSH.&lt;/li&gt;
&lt;li&gt;Improvements to maintain &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#disconnect-warp-on-all-devices&quot;&gt;Global WARP override&lt;/a&gt; settings when &lt;a href=&quot;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&quot;&gt;switching between organizations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Improvements to maintain client connectivity during network changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd&quot;&gt;Windows 11 24H2 KB5062553&lt;/a&gt; or higher for resolution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server&quot;&gt;Route traffic to fallback server&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Devices with KB5055523 installed may receive a warning about &lt;code&gt;Win32/ClickFix.ABA&lt;/code&gt; being present in the installer. To resolve this false positive, update Microsoft Security Intelligence to &lt;a href=&quot;https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0&quot;&gt;version 1.429.19.0&lt;/a&gt; or later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS resolution may be broken when the following conditions are all true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.&lt;/li&gt;
&lt;li&gt;A custom DNS server address is configured on the primary network adapter.&lt;/li&gt;
&lt;li&gt;The custom DNS server address on the primary network adapter is changed while WARP is connected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To work around this issue, reconnect the WARP client by toggling off and back on.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 30 Sep 2025 20:43:09 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - WARP client for macOS (version 2025.7.176.0)</title><link>https://developers.cloudflare.com/changelog/post/2025-09-30-warp-macos-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-30-warp-macos-ga/</guid><description>&lt;p&gt;A new GA release for the macOS WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes and improvements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a bug preventing the &lt;code&gt;warp-diag captive-portal&lt;/code&gt; command from running successfully due to the client not parsing SSID on macOS.&lt;/li&gt;
&lt;li&gt;Improvements to maintain &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#disconnect-warp-on-all-devices&quot;&gt;Global WARP override&lt;/a&gt; settings when &lt;a href=&quot;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&quot;&gt;switching between organizations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;MASQUE is now the default &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#device-tunnel-protocol&quot;&gt;tunnel protocol&lt;/a&gt; for all new WARP device profiles.&lt;/li&gt;
&lt;li&gt;Improvement to limit idle connections in &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#dns-only-mode&quot;&gt;Gateway with DoH mode&lt;/a&gt; to avoid unnecessary resource usage that can lead to DoH requests not resolving.&lt;/li&gt;
&lt;li&gt;Improvements to maintain client connectivity during network changes.&lt;/li&gt;
&lt;li&gt;The WARP client now supports macOS Tahoe (version 26.0).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server&quot;&gt;Route traffic to fallback server&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 30 Sep 2025 20:43:08 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - WARP client for Linux (version 2025.7.176.0)</title><link>https://developers.cloudflare.com/changelog/post/2025-09-30-warp-linux-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-30-warp-linux-ga/</guid><description>&lt;p&gt;A new GA release for the Linux WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/&quot;&gt;stable releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://pkg.cloudflareclient.com/&quot;&gt;pkg.cloudflareclient.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MASQUE is now the default &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#device-tunnel-protocol&quot;&gt;tunnel protocol&lt;/a&gt; for all new WARP device profiles.&lt;/li&gt;
&lt;li&gt;Improvement to limit idle connections in &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#dns-only-mode&quot;&gt;Gateway with DoH mode&lt;/a&gt; to avoid unnecessary resource usage that can lead to DoH requests not resolving.&lt;/li&gt;
&lt;li&gt;Improvements to maintain &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#disconnect-warp-on-all-devices&quot;&gt;Global WARP override&lt;/a&gt; settings when &lt;a href=&quot;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&quot;&gt;switching between organizations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Improvements to maintain client connectivity during network changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server&quot;&gt;Route traffic to fallback server&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Tue, 30 Sep 2025 20:20:30 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Gateway - Application granular controls for operations in SaaS applications</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-new-granular-controls-for-saas-applications/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-new-granular-controls-for-saas-applications/</guid><description>&lt;p&gt;Gateway users can now apply granular controls to their file sharing and AI chat applications through &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies&quot;&gt;HTTP policies&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The new feature offers two methods of controlling SaaS applications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Application Controls&lt;/strong&gt; are curated groupings of Operations which provide an easy way for users to achieve a specific outcome. Application Controls may include &lt;em&gt;Upload&lt;/em&gt;, &lt;em&gt;Download&lt;/em&gt;, &lt;em&gt;Prompt&lt;/em&gt;, &lt;em&gt;Voice&lt;/em&gt;, and &lt;em&gt;Share&lt;/em&gt; depending on the application.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operations&lt;/strong&gt; 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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Get started using &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/granular-controls&quot;&gt;Application Granular Controls&lt;/a&gt; and refer to the list of &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/granular-controls/#compatible-applications&quot;&gt;supported applications&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Tue, 30 Sep 2025 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category></item><item><title>Radar - Regional Data in Cloudflare Radar</title><link>https://developers.cloudflare.com/changelog/post/2025-09-29-radar-regional-data/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-29-radar-regional-data/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/radar/&quot;&gt;&lt;strong&gt;Radar&lt;/strong&gt;&lt;/a&gt; now introduces Regional Data, providing traffic insights that bring a more localized perspective to the traffic trends shown on Radar.&lt;/p&gt;
&lt;p&gt;The following API endpoints are now available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/geolocations/methods/get/&quot;&gt;&lt;code&gt;Get Geolocation&lt;/code&gt;&lt;/a&gt; - Retrieves geolocation by &lt;code&gt;geoId&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/geolocations/methods/list/&quot;&gt;&lt;code&gt;List Geolocations&lt;/code&gt;&lt;/a&gt; - Lists geolocations.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/netflows/methods/summary_v2/&quot;&gt;&lt;code&gt;NetFlows Summary By Dimension&lt;/code&gt;&lt;/a&gt; - Retrieves NetFlows summary by dimension.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All &lt;code&gt;summary&lt;/code&gt; and &lt;code&gt;timeseries_groups&lt;/code&gt; endpoints in &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/http/&quot;&gt;&lt;code&gt;HTTP&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/netflows/&quot;&gt;&lt;code&gt;NetFlows&lt;/code&gt;&lt;/a&gt; now include an &lt;code&gt;adm1&lt;/code&gt; dimension for grouping data by first level administrative division (for example, state, province, etc.)&lt;/p&gt;
&lt;p&gt;A new filter &lt;code&gt;geoId&lt;/code&gt; was also added to all endpoints in &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/http/&quot;&gt;&lt;code&gt;HTTP&lt;/code&gt;&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/api/resources/radar/subresources/netflows/&quot;&gt;&lt;code&gt;NetFlows&lt;/code&gt;&lt;/a&gt;, allowing filtering by a specific administrative division.&lt;/p&gt;
&lt;p&gt;Check out the new Regional traffic insights on a country specific traffic page &lt;a href=&quot;https://radar.cloudflare.com/traffic/pt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;new Radar page&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 29 Sep 2025 00:00:00 GMT</pubDate><product>Radar</product><category>Radar</category></item><item><title>WAF - WAF Release - 2025-09-29</title><link>https://developers.cloudflare.com/changelog/post/2025-09-29-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-29-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SimpleHelp (CVE-2024-57727): Authentication bypass in SimpleHelp that can allow unauthorized access to management interfaces or sessions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Vite (CVE-2025-30208): Directory-traversal vulnerability in Vite allowing access to filesystem paths outside the intended web root.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These vulnerabilities allow attackers to gain access, escalate privileges, or execute actions that were previously unavailable:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;6fe90532af50427484a5275c8c2e30fb&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8c2e30fb&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;100717&lt;/td&gt;&lt;td&gt;SimpleHelp - Auth Bypass - CVE:CVE-2024-57727&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule is merged to 100717 in legacy WAF and &lt;rule-id id=&quot;498fcd81a62a4b5ca943e2de958094d3&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...958094d3&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt; in new WAF&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;013ef5de3f074fd5a43cdd70d58b886b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d58b886b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100775&lt;/td&gt;&lt;td&gt;Flowise Cloud - Information Disclosure - CVE:CVE-2025-58434&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;68fc5c086ccb4b40a35a63b19bce1ff4&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...9bce1ff4&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100881&lt;/td&gt;&lt;td&gt;WordPress:Plugin:Ditty - SSRF - CVE:CVE-2025-8085&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;9e1a56e6b3bc49b187bf6e35ddc329dd&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ddc329dd&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100887&lt;/td&gt;&lt;td&gt;Vite - Directory Traversal - CVE:CVE-2025-30208&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 29 Sep 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>WAF - WAF Release - 2025-09-28 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2025-09-28-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-28-emergency-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cisco (CVE-2025-20333, CVE-2025-20362, CVE-2025-20363): Exploitation enables attackers to escalate privileges or achieve remote code execution via command injection.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;a1bef4ada0b146d2862cad439ee0ab84&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...9ee0ab84&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;100788&lt;/td&gt;&lt;td&gt;Cisco Secure Firewall Adaptive Security Appliance - Remote Code Execution - CVE:CVE-2025-20333, CVE:CVE-2025-20362, CVE:CVE-2025-20363&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;51de6ce6596a40eb8200452ad30f768e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...d30f768e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100788A&lt;/td&gt;&lt;td&gt;Cisco Secure Firewall Adaptive Security Appliance - Remote Code Execution - CVE:CVE-2025-20333, CVE:CVE-2025-20362, CVE:CVE-2025-20363&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Sun, 28 Sep 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>WAF - WAF Release - 2025-09-26</title><link>https://developers.cloudflare.com/changelog/post/2025-09-26-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-26-waf-release/</guid><description>
&lt;p&gt;&lt;strong&gt;Managed Ruleset Updated&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;3ffd242b4ba242ca965022d3a67d8561&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...a67d8561&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;100859A&lt;/td&gt;&lt;td&gt;SQLi - UNION - 3&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;91d9cf56355b4ab88481b2fd4de80468&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...4de80468&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100889&lt;/td&gt;&lt;td&gt;Command Injection - Generic 9&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;c15ca8e8290f485287037665f2be3ddf&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...f2be3ddf&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100890&lt;/td&gt;&lt;td&gt;Information Disclosure - Common Files - 2&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;56669615f2984c2cac8c608980a252a8&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...80a252a8&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100891&lt;/td&gt;&lt;td&gt;Anomaly:URL - Relative Paths&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;c41789fb6370431d809567d17e7d3865&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...7e7d3865&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100894&lt;/td&gt;&lt;td&gt;XSS - Inline Function&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;b995d0b930604fa6b8d9b2a13792565c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...3792565c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100895&lt;/td&gt;&lt;td&gt;XSS - DOM&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ab8277e3f432400bbd9403dd42978e38&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...42978e38&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100896&lt;/td&gt;&lt;td&gt;SQLi - MSSQL Length Enumeration&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;3ec33bc5ac77495a9f55020e3ab43f7e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...3ab43f7e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100897&lt;/td&gt;&lt;td&gt;Generic Rules - Code Injection - 3&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;4375dc90c7af4c55908f6b95c1686741&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...c1686741&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100898&lt;/td&gt;&lt;td&gt;SQLi - Evasion&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;945c5aa9f45141dd872d7ec920999be0&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...20999be0&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100899&lt;/td&gt;&lt;td&gt;SQLi - Probing 2&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;2c20b5e8684043f48620ff77b4026c88&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...b4026c88&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100900&lt;/td&gt;&lt;td&gt;SQLi - Probing&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Fri, 26 Sep 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers - Automatic loopback bindings via ctx.exports</title><link>https://developers.cloudflare.com/changelog/post/2025-09-26-ctx-exports/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-26-ctx-exports/</guid><description>&lt;p&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/context/#exports&quot;&gt;&lt;code&gt;ctx.exports&lt;/code&gt; API&lt;/a&gt; contains automatically-configured bindings corresponding to your Worker&apos;s top-level exports. For each top-level export extending &lt;code&gt;WorkerEntrypoint&lt;/code&gt;, &lt;code&gt;ctx.exports&lt;/code&gt; will contain a &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings&quot;&gt;Service Binding&lt;/a&gt; by the same name, and for each export extending &lt;code&gt;DurableObject&lt;/code&gt; (and for which storage has been configured via a &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/&quot;&gt;migration&lt;/a&gt;), &lt;code&gt;ctx.exports&lt;/code&gt; will contain a &lt;a href=&quot;https://developers.cloudflare.com/durable-objects/api/namespace/&quot;&gt;Durable Object namespace binding&lt;/a&gt;. This means you no longer have to configure these bindings explicitly in &lt;code&gt;wrangler.jsonc&lt;/code&gt;/&lt;code&gt;wrangler.toml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { WorkerEntrypoint } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;cloudflare:workers&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Greeter&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; extends&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkerEntrypoint&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;  greet&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; `Hello, ${&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;}!`&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;ctx&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    let&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; greeting &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; ctx.exports.Greeter.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;greet&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;World&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(greeting);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;At present, you must use &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/compatibility-flags#enable-ctxexports&quot;&gt;the &lt;code&gt;enable_ctx_exports&lt;/code&gt; compatibility flag&lt;/a&gt; to enable this API, though it will be on by default in the future.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/context/#exports&quot;&gt;See the API reference for more information.&lt;/a&gt;&lt;/p&gt;
</description><pubDate>Fri, 26 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Pipelines - Pipelines now supports SQL transformations and Apache Iceberg</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-pipelines-sql/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-pipelines-sql/</guid><description>
&lt;p&gt;Today, we&apos;re launching the new &lt;a href=&quot;https://developers.cloudflare.com/pipelines/&quot;&gt;Cloudflare Pipelines&lt;/a&gt;: a streaming data platform that ingests events, transforms them with &lt;a href=&quot;https://developers.cloudflare.com/pipelines/sql-reference/select-statements/&quot;&gt;SQL&lt;/a&gt;, and writes to &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2&lt;/a&gt; as &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables or Parquet files.&lt;/p&gt;
&lt;p&gt;Pipelines can receive events via &lt;a href=&quot;https://developers.cloudflare.com/pipelines/streams/writing-to-streams/#send-via-http&quot;&gt;HTTP endpoints&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/pipelines/streams/writing-to-streams/#send-via-workers&quot;&gt;Worker bindings&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;For example, here&apos;s a pipeline that ingests clickstream events and filters out bot traffic while extracting domain information:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sql&quot; data-nb-lang=&quot;sql&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;INSERT into&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; events_table&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;SELECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  user_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  lower&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;event&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; event_type,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  to_timestamp_micros(ts_us) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; event_time,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  regexp_match(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;^https?://([^/]+)&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;)[1]  &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;AS&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; domain,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  url&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  referrer,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  user_agent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;FROM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; events_json&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;WHERE&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; event&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;page_view&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  AND&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; NOT&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; regexp_like(user_agent, &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;(?i)bot|spider&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Get started by creating a pipeline in the dashboard or running a single command in &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; pipelines&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; setup&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Check out our &lt;a href=&quot;https://developers.cloudflare.com/pipelines/getting-started/&quot;&gt;getting started guide&lt;/a&gt; to learn how to create a pipeline that delivers events to an &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;Iceberg table&lt;/a&gt; you can query with R2 SQL. Read more about today&apos;s announcement in our &lt;a href=&quot;https://blog.cloudflare.com/cloudflare-data-platform&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;blog post&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 25 Sep 2025 13:00:00 GMT</pubDate><product>Pipelines</product><category>Pipelines</category></item><item><title>R2 SQL - Announcing R2 SQL</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-announcing-r2-sql-open-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-announcing-r2-sql-open-beta/</guid><description>
&lt;p&gt;Today, we&apos;re launching the &lt;strong&gt;open beta&lt;/strong&gt; for &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/&quot;&gt;R2 SQL&lt;/a&gt;: A serverless, distributed query engine that can efficiently analyze petabytes of data in &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables managed by &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;R2 SQL is ideal for exploring analytical and time-series data stored in R2, such as logs, events from &lt;a href=&quot;https://developers.cloudflare.com/pipelines/&quot;&gt;Pipelines&lt;/a&gt;, or clickstream and user behavior data.&lt;/p&gt;
&lt;p&gt;If you already have a table in R2 Data Catalog, running queries is as simple as:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; sql&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; query&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; YOUR_WAREHOUSE&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;SELECT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    user_id,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    event_type,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    value&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;FROM events.user_events&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;WHERE event_type = &apos;CHANGELOG&apos; or event_type = &apos;BLOG&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;  AND __ingest_ts &amp;gt; &apos;2025-09-24T00:00:00Z&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;ORDER BY __ingest_ts DESC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;LIMIT 100&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To get started with R2 SQL, check out our &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/get-started/&quot;&gt;getting started guide&lt;/a&gt; or learn more about supported features in the &lt;a href=&quot;https://developers.cloudflare.com/r2-sql/sql-reference/&quot;&gt;SQL reference&lt;/a&gt;. For a technical deep dive into how we built R2 SQL, read our &lt;a href=&quot;https://blog.cloudflare.com/r2-sql-deep-dive/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;blog post&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 25 Sep 2025 13:00:00 GMT</pubDate><product>R2 SQL</product><category>R2 SQL</category></item><item><title>Browser Run - Browser Rendering Playwright GA, Stagehand support (Beta), and higher limits</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-br-playwright-ga-stagehand-limits/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-br-playwright-ga-stagehand-limits/</guid><description>&lt;p&gt;We’re shipping three updates to Browser Rendering:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Playwright support is now Generally Available and synced with &lt;a href=&quot;https://playwright.dev/docs/release-notes#version-155&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Playwright v1.55&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, giving you a stable foundation for critical automation and AI-agent workflows.&lt;/li&gt;
&lt;li&gt;We’re also adding &lt;a href=&quot;https://developers.cloudflare.com/browser-run/stagehand/&quot;&gt;Stagehand support (Beta)&lt;/a&gt; so you can combine code with natural language instructions to build more resilient automations.&lt;/li&gt;
&lt;li&gt;Finally, we’ve tripled &lt;a href=&quot;https://developers.cloudflare.com/browser-run/limits/#workers-paid&quot;&gt;limits&lt;/a&gt; for paid plans across both the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/quick-actions/&quot;&gt;REST API&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/browser-run/#integration-methods&quot;&gt;Browser Sessions&lt;/a&gt; to help you scale.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get started with Stagehand, refer to the &lt;a href=&quot;https://developers.cloudflare.com/browser-run/stagehand/&quot;&gt;Stagehand&lt;/a&gt; example that uses Stagehand and &lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI&lt;/a&gt; to search for a movie on this &lt;a href=&quot;https://demo.playwright.dev/movies&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;example movie directory&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, extract its details using natural language (title, year, rating, duration, and genre), and return the information along with a screenshot of the webpage.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;Stagehand example&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;ts&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; stagehand&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Stagehand&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	env: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;LOCAL&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	localBrowserLaunchOptions: { cdpUrl: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;endpointURLString&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;BROWSER&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	llmClient: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; WorkersAIClient&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	verbose: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stagehand.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; page&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stagehand.page;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; page.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;goto&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;https://demo.playwright.dev/movies&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// if search is a multi-step action, stagehand will return an array of actions it needs to act on&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; actions&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; page.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;observe&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&apos;Search for &quot;Furiosa&quot;&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; action&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; of&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; actions) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; page.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;act&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(action);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; page.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;act&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Click the search result&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// normal playwright functions work as expected&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; page.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;waitForSelector&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;.info-wrapper .cast&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; movieInfo &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; page.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;extract&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	instruction: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Extract movie information&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	schema: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		title: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		year: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		rating: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		genres: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;()),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		duration: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;describe&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Duration in minutes&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; stagehand.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;close&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;img src=&quot;https://developers.cloudflare.com/images/browser-run/speedystagehand.gif&quot; alt=&quot;Stagehand video&quot;&gt;</description><pubDate>Thu, 25 Sep 2025 12:00:00 GMT</pubDate><product>Browser Run</product><category>Browser Run</category></item><item><title>AI Search - AI Search (formerly AutoRAG) now with More Models To Choose From</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-ai-search-more-models/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-ai-search-more-models/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To use AI Search with other &lt;a href=&quot;https://developers.cloudflare.com/ai-search/configuration/models/&quot;&gt;model providers&lt;/a&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Add provider keys to AI Gateway&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;Go to AI &amp;gt; AI Gateway in the dashboard.&lt;/li&gt;
&lt;li&gt;Select or create an AI gateway.&lt;/li&gt;
&lt;li&gt;In Provider Keys, choose your provider, click Add, and enter the key.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connect a gateway to AI Search&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Select models&lt;/strong&gt;: 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.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once configured, your AI Search instance will be able to reference models available through your AI Gateway when making a &lt;code&gt;/ai-search&lt;/code&gt; request:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;javascript&quot; data-nb-lang=&quot;javascript&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;  async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;    // Query your AI Search instance with a natural language question to an OpenAI model&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;autorag&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-ai-search&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;aiSearch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      query: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;What&apos;s new for Cloudflare Birthday Week?&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      model: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;openai/gpt-5&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;    // Return only the generated answer as plain text&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(result.response, {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;      headers: { &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Content-Type&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text/plain&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;    });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/changelog/product/ai-search/&quot;&gt;AI Search Changelog&lt;/a&gt; and &lt;a href=&quot;https://discord.cloudflare.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Discord&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; for more updates!&lt;/p&gt;</description><pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Containers - Run more Containers with higher resource limits</title><link>https://developers.cloudflare.com/changelog/post/2025-09-24-higher-container-resource-limits/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-24-higher-container-resource-limits/</guid><description>&lt;p&gt;You can now run more Containers concurrently with higher limits on CPU, memory, and disk.&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;th&gt;New Limit&lt;/th&gt;
&lt;th&gt;Previous Limit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Memory for concurrent live Container instances&lt;/td&gt;
&lt;td&gt;400GiB&lt;/td&gt;
&lt;td&gt;40GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vCPU for concurrent live Container instances&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk for concurrent live Container instances&lt;/td&gt;
&lt;td&gt;2TB&lt;/td&gt;
&lt;td&gt;100GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;You can now run 1000 instances of the &lt;code&gt;dev&lt;/code&gt; instance type, 400 instances of &lt;code&gt;basic&lt;/code&gt;, or 100 instances of &lt;code&gt;standard&lt;/code&gt; concurrently.&lt;/p&gt;
&lt;p&gt;This opens up new possibilities for running larger-scale workloads on Containers.&lt;/p&gt;
&lt;p&gt;See the &lt;a href=&quot;https://developers.cloudflare.com/containers/get-started/&quot;&gt;getting started guide&lt;/a&gt; to deploy your first Container,
and the &lt;a href=&quot;https://developers.cloudflare.com/containers/platform-details/limits/&quot;&gt;limits documentation&lt;/a&gt; for more details on the available instance types and limits.&lt;/p&gt;</description><pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate><product>Containers</product><category>Containers</category></item><item><title>Gateway, Data Loss Prevention - Refine DLP Scans with New Body Phase Selector</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-body-phase-selector/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-body-phase-selector/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;In the Gateway HTTP policy builder, you will find a new selector called &lt;em&gt;Body Phase&lt;/em&gt;. This allows you to define the direction of traffic the DLP engine will inspect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Request Body&lt;/em&gt;: Scans data sent from a user&apos;s machine to an upstream service. This is ideal for monitoring data uploads, form submissions, or other user-initiated data exfiltration attempts.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Response Body&lt;/em&gt;: Scans data sent to a user&apos;s machine from an upstream service. Use this to inspect file downloads and website content for sensitive data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;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 &lt;strong&gt;Body Phase&lt;/strong&gt; to &lt;em&gt;Request Body&lt;/em&gt;, the policy will only trigger if the user attempts to upload or submit an SSN, ignoring the content of the web page itself.&lt;/p&gt;
&lt;p&gt;All policies without this selector will continue to scan both request and response bodies to ensure continued protection.&lt;/p&gt;
&lt;p&gt;For more information, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/http-policies/#body-phase&quot;&gt;Gateway HTTP policy selectors&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category><category>Data Loss Prevention</category></item><item><title>Cloudflare Fundamentals - Sign in with GitHub</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-sign-in-with-github/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-sign-in-with-github/</guid><description>&lt;p&gt;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 &lt;code&gt;Sign in with GitHub&lt;/code&gt; button on the dashboard login page. You will be logged in with your primary GitHub email address.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;for-more-information&quot;&gt;For more information&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#for-more-information&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/user-profiles/login/&quot;&gt;Log in to Cloudflare&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>Cloudflare Fundamentals - SSO for all</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-sso-for-all/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-sso-for-all/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;for-more-information&quot;&gt;For more information&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#for-more-information&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.cloudflare.com/enterprise-grade-features-for-all/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Every Cloudflare feature, available to all&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/manage-members/dashboard-sso/&quot;&gt;Configure Dashboard SSO&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>R2, R2 Data Catalog - R2 Data Catalog now supports compaction</title><link>https://developers.cloudflare.com/changelog/post/2025-09-25-data-catalog-compaction/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-25-data-catalog-compaction/</guid><description>
&lt;p&gt;You can now enable automatic compaction for &lt;a href=&quot;https://iceberg.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Apache Iceberg&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; tables in &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/&quot;&gt;R2 Data Catalog&lt;/a&gt; to improve query performance.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To enable automatic compaction in R2 Data Catalog, find it under &lt;strong&gt;R2 Data Catalog&lt;/strong&gt; in your R2 bucket settings in the dashboard.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=799,height=400,format=webp/_astro/compaction.MLojYuHL.png&quot; alt=&quot;compaction-dash&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;799&quot; height=&quot;400&quot;&gt;
&lt;p&gt;Or with &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler&lt;/a&gt;, run:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;npx&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; r2&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; bucket&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; catalog&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; compaction&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; enable&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;BUCKET_NAM&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;E&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  --target-size&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; 128&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --token&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;API_TOKE&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;To get started with compaction, check out &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/manage-catalogs/&quot;&gt;manage catalogs&lt;/a&gt;. For best practices and limitations, refer to &lt;a href=&quot;https://developers.cloudflare.com/r2-data-catalog/table-maintenance/&quot;&gt;about compaction&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 25 Sep 2025 00:00:00 GMT</pubDate><product>R2</product><category>R2</category><category>R2 Data Catalog</category></item><item><title>WAF - WAF Release - 2025-09-24 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2025-09-24-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-24-emergency-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GoAnywhere MFT (CVE-2025-10035): Exploitation enables attackers to escalate privileges or achieve remote code execution via command injection.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;8fe242c7c0d64d689f4fc9a1e08b39f3&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...e08b39f3&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;100787&lt;/td&gt;&lt;td&gt;Fortra GoAnywhere - Auth Bypass - CVE:CVE-2025-10035&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Wed, 24 Sep 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Email security - Invalid Submissions Feedback</title><link>https://developers.cloudflare.com/changelog/post/2025-09-23-invalid-submissions/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-23-invalid-submissions/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;To ensure all customer feedback is actionable, we have launched two new features to manage invalid submissions sent to our team and user &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/email-security/settings/phish-submissions/submission-addresses/&quot;&gt;submission aliases&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Email Notifications:&lt;/strong&gt; We now automatically notify users by email when they provide an invalid submission, educating them on the correct format. To disable notifications, go to &lt;strong&gt;&lt;a href=&quot;https://one.dash.cloudflare.com/?to=/:account/email-security/settings&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Settings&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/strong&gt; &amp;gt; &lt;strong&gt;Invalid submission emails&lt;/strong&gt; and turn the feature off.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1096,height=175,format=webp/_astro/EmailSec-Invalid-Submissions-Toggle.DXjbR6aX.png&quot; alt=&quot;EmailSec-Invalid-Submissions-Toggle&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1096&quot; height=&quot;175&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Invalid Submission dashboard:&lt;/strong&gt; You can quickly identify which users need education to provide valid submissions so Cloudflare can provide continuous protection.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1132,height=511,format=webp/_astro/EmailSec-Invalid-Submissions-Dashboard.zuf1on2n.png&quot; alt=&quot;EmailSec-Invalid-Submissions-Dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1132&quot; height=&quot;511&quot;&gt;
&lt;p&gt;Learn more about this feature on &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/email-security/submissions/invalid-submissions/&quot;&gt;invalid submissions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This feature is available across these Email security packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advantage&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise + PhishGuard&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 23 Sep 2025 23:11:49 GMT</pubDate><product>Email security</product><category>Email security</category></item><item><title>Workers - Improved support for running multiple Workers with `wrangler dev`</title><link>https://developers.cloudflare.com/changelog/post/2025-09-23-wrangler-dev-multi-config-cross-command-support/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-23-wrangler-dev-multi-config-cross-command-support/</guid><description>&lt;p&gt;You can run multiple Workers in a single dev command by passing multiple config files to &lt;code&gt;wrangler dev&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; dev&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --config&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ./web/wrangler.jsonc&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --config&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ./api/wrangler.jsonc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/service-bindings/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Service Bindings&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/observability/logs/tail-workers/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Tail Workers&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; in local development, when running separate wrangler dev sessions.&lt;/p&gt;
&lt;p&gt;Now, the following works as expected:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Terminal 1: Run your application that includes both Web and API workers&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; dev&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --config&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ./web/wrangler.jsonc&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --config&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ./api/wrangler.jsonc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Terminal 2: Run your auth worker separately&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; dev&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --config&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ./auth/wrangler.jsonc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;These Workers can now communicate with each other across separate dev commands, regardless of your development setup.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure nb-code-figure-titled&quot; data-nb-lang=&quot;js&quot;&gt;&lt;figcaption class=&quot;nb-code-title&quot;&gt;&lt;span class=&quot;nb-code-title-name&quot;&gt;./api/src/index.ts&lt;/span&gt;&lt;span class=&quot;nb-code-title-lang&quot;&gt;js&lt;/span&gt;&lt;/figcaption&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;export&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	async&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;env&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// This service binding call now works across dev commands&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; authorized&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AUTH&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;isAuthorized&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(request);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;authorized) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Unauthorized&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { status: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;401&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;		return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Response&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Hello from API Worker!&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, { status: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; });&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://developers.cloudflare.com/workers/local-development/multi-workers&quot;&gt;Developing with multiple Workers&lt;/a&gt; guide to learn more about the different approaches and when to use each one.&lt;/p&gt;</description><pubDate>Tue, 23 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Access - Access Remote Desktop Protocol (RDP) destinations securely from your browser — now generally available!</title><link>https://developers.cloudflare.com/changelog/post/2025-09-22-browser-based-rdp-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-22-browser-based-rdp-ga/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/rdp/rdp-browser/&quot;&gt;Browser-based RDP&lt;/a&gt; with &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/access-controls/policies/&quot;&gt;Cloudflare Access&lt;/a&gt; is now generally available for all Cloudflare customers. It enables secure, remote Windows server access without VPNs or RDP clients.&lt;/p&gt;
&lt;p&gt;Since we announced our &lt;a href=&quot;https://developers.cloudflare.com/changelog/access/#2025-06-30&quot;&gt;open beta&lt;/a&gt;, we&apos;ve made a few improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Support for targets with IPv6.&lt;/li&gt;
&lt;li&gt;Support for &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/&quot;&gt;Magic WAN&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/&quot;&gt;WARP Connector&lt;/a&gt; as on-ramps.&lt;/li&gt;
&lt;li&gt;More robust error messaging on the login page to help you if you encounter an issue.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a refresher, here are some benefits browser-based RDP provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Control how users authenticate to internal RDP resources&lt;/strong&gt; with single sign-on (SSO), multi-factor authentication (MFA), and granular access policies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Record who is accessing which servers and when&lt;/strong&gt; to support regulatory compliance requirements and to gain greater visibility in the event of a security event.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eliminate the need to install and manage software on user devices&lt;/strong&gt;. You will only need a web browser.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduce your attack surface&lt;/strong&gt; by keeping your RDP servers off the public Internet and protecting them from common threats like credential stuffing or brute-force attacks.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2132,height=1814,format=webp/_astro/browser-based-rdp-access-app.BNXce1JL.png&quot; alt=&quot;Example of a browser-based RDP Access application&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2132&quot; height=&quot;1814&quot;&gt;
&lt;p&gt;To get started, refer to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/rdp/rdp-browser/&quot;&gt;Connect to RDP in a browser&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 22 Sep 2025 00:00:00 GMT</pubDate><product>Access</product><category>Access</category></item><item><title>WAF - WAF Release - 2025-09-22</title><link>https://developers.cloudflare.com/changelog/post/2025-09-22-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-22-waf-release/</guid><description>
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Azure (CVE-2025-54914): Vulnerability in Azure Networking allowing elevation of privileges.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Generic SQLi / SSRF improvements: Expanded rule coverage to detect obfuscated SQL injection patterns and SSRF across host, local, and cloud contexts.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These vulnerabilities allow attackers to escalate privileges or execute code under conditions where previously they could not:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Skyvern CVE-2025-49619 allows authenticated users with minimal privilege to exploit SSTI for remote code execution, undermining isolation of workflow components.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The improvements for SQLi and SSRF reduce risk from common injection and request-based attacks.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;c36a425ae0c94789a9bc34f06a135cbf&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...6a135cbf&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;100146&lt;/td&gt;&lt;td&gt;SSRF - Host - 2&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;dfa84b0aed5a4b45b953a36a57035abf&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...57035abf&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100146B&lt;/td&gt;&lt;td&gt;SSRF - Local - 2&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;276073e60c7a4b4d91faba1fbbe18d50&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...bbe18d50&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100146C&lt;/td&gt;&lt;td&gt;SSRF - Cloud - 2&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;78c856218f2d40f4b5988c8c956c1961&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...956c1961&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100714&lt;/td&gt;&lt;td&gt;Azure - Auth Bypass - CVE:CVE-2025-54914&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;9f1c8d4cbf3848dbb940771bc5ced231&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...c5ced231&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100758&lt;/td&gt;&lt;td&gt;Skyvern - Remote Code Execution - CVE:CVE-2025-49619&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;6be7e7829f3b43c688e1ac4284a619a1&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...84a619a1&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100773&lt;/td&gt;&lt;td&gt;Next.js - SSRF&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;0cc3f50216bf4b448210bcc3983ff2dd&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...983ff2dd&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100774&lt;/td&gt;&lt;td&gt;Adobe Commerce - Remote Code Execution - CVE:CVE-2025-54236&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;53bfaeb311a049e3877fa15c0380a1a6&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...0380a1a6&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100800_BETA&lt;/td&gt;&lt;td&gt;SQLi - Obfuscated Boolean - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule has been merged into the original rule (ID: &lt;rule-id id=&quot;7663ea44178441a0b3205c145563445f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...5563445f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 22 Sep 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>AI Search - New Metrics View in AutoRAG</title><link>https://developers.cloudflare.com/changelog/post/2025-09-19-autorag-metrics/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-19-autorag-metrics/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/ai-search/&quot;&gt;AutoRAG&lt;/a&gt; now includes a &lt;strong&gt;Metrics&lt;/strong&gt; tab that shows how your data is indexed and searched. Get a clear view of the health of your indexing pipeline, compare usage between &lt;code&gt;ai-search&lt;/code&gt; and &lt;code&gt;search&lt;/code&gt;, and see which files are retrieved most often.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=2062,height=1765,format=webp/_astro/metrics.BBUwKIos.png&quot; alt=&quot;Metrics&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2062&quot; height=&quot;1765&quot;&gt;
&lt;p&gt;You can find these metrics within each AutoRAG instance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Indexing: Track how files are ingested and see status changes over time.&lt;/li&gt;
&lt;li&gt;Search breakdown: Compare usage between &lt;code&gt;ai-search&lt;/code&gt; and &lt;code&gt;search&lt;/code&gt; endpoints.&lt;/li&gt;
&lt;li&gt;Top file retrievals: Identify which files are most frequently retrieved in a given period.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Try it today in &lt;a href=&quot;https://developers.cloudflare.com/ai-search/get-started/&quot;&gt;AutoRAG&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Fri, 19 Sep 2025 00:00:00 GMT</pubDate><product>AI Search</product><category>AI Search</category></item><item><title>Workers - Rate Limiting in Workers is now GA</title><link>https://developers.cloudflare.com/changelog/post/2025-09-19-ratelimit-workers-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-19-ratelimit-workers-ga/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/rate-limit/&quot;&gt;Rate Limiting within Cloudflare Workers&lt;/a&gt; is now Generally Available (GA).&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;ratelimit&lt;/code&gt; 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.&lt;/p&gt;
&lt;p&gt;For more details, refer to &lt;a href=&quot;https://developers.cloudflare.com/workers/runtime-apis/bindings/rate-limit/&quot;&gt;Workers Rate Limiting&lt;/a&gt; documentation.&lt;/p&gt;</description><pubDate>Fri, 19 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Panic Recovery for Rust Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-09-19-workers-rs-panic-recovery/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-19-workers-rs-panic-recovery/</guid><description>
&lt;p&gt;In &lt;a href=&quot;https://github.com/cloudflare/workers-rs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;workers-rs&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;Now, when a panic occurs, in-flight requests will throw 500 errors, but the Worker will automatically and instantly recover for future requests.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;fixing-rust-panics-with-wasm-bindgen&quot;&gt;Fixing Rust Panics with Wasm Bindgen&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#fixing-rust-panics-with-wasm-bindgen&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;We now attach a default panic handler in Rust:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;rust&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;rust&quot; data-nb-lang=&quot;rust&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;panic&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;set_hook&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;Box&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;move&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;panic_info&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;  hook_impl&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(panic_info);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}));&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Which is registered by default in the JS initialization:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;js&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;js&quot; data-nb-lang=&quot;js&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { setPanicHook } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;./index.js&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;setPanicHook&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Panic handler!&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, err);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;When a panic occurs, we reset the Wasm state to revert the Wasm application to how it was when the application started.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;resetting-vm-state-in-wasm-bindgen&quot;&gt;Resetting VM State in Wasm Bindgen&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#resetting-vm-state-in-wasm-bindgen&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;We worked upstream on the Wasm Bindgen project to implement a new &lt;a href=&quot;https://github.com/wasm-bindgen/wasm-bindgen/pull/4644&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;--experimental-reset-state-function&lt;/code&gt; compilation option&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; which outputs a new &lt;code&gt;__wbg_reset_state&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;This function clears all internal state related to the Wasm VM, and updates all function bindings in place to reference the new WebAssembly instance.&lt;/p&gt;
&lt;p&gt;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 &quot;stale object&quot; error is specially thrown when using this feature.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;layered-solution&quot;&gt;Layered Solution&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#layered-solution&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;This approach now provides full panic recovery for Rust Workers on subsequent requests.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;webassembly-exception-handling&quot;&gt;WebAssembly Exception Handling&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#webassembly-exception-handling&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In the future, full support for recoverable panics could be implemented without needing reinitialization at all, utilizing the &lt;a href=&quot;https://github.com/WebAssembly/exception-handling/blob/main/proposals/exception-handling/Exceptions.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WebAssembly Exception Handling&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;
proposal, part of the newly announced &lt;a href=&quot;https://webassembly.org/news/2025-09-17-wasm-3.0/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;WebAssembly 3.0&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; specification. This would allow unwinding panics as normal JS errors, and concurrent requests would no longer fail.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We&apos;re making significant improvements to the reliability of &lt;a href=&quot;https://github.com/cloudflare/workers-rs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Rust Workers&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;. Join us in &lt;code&gt;#rust-on-workers&lt;/code&gt; on the &lt;a href=&quot;https://discord.gg/cloudflaredev&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Developers Discord&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to stay updated.&lt;/strong&gt;&lt;/p&gt;</description><pubDate>Fri, 19 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare Tunnel, Cloudflare Tunnel for SASE - Connect and secure any private or public app by hostname, not IP — with hostname routing for Cloudflare Tunnel</title><link>https://developers.cloudflare.com/changelog/post/2025-09-18-tunnel-hostname-routing/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-18-tunnel-hostname-routing/</guid><description>
&lt;p&gt;You can now route private traffic to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/&quot;&gt;Cloudflare Tunnel&lt;/a&gt; based on a hostname or domain, moving beyond the limitations of IP-based routing. This new capability is &lt;strong&gt;free for all Cloudflare One customers&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Previously, Tunnel routes could only be defined by IP address or &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/cloudflared/connect-cidr/&quot;&gt;CIDR range&lt;/a&gt;. This created a challenge for modern applications with dynamic or ephemeral IP addresses, often forcing administrators to maintain complex and brittle IP lists.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1990,height=530,format=webp/_astro/tunnel-hostname-routing.DSi8MP_7.webp&quot; alt=&quot;Hostname-based routing in Cloudflare Tunnel&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1990&quot; height=&quot;530&quot;&gt;
&lt;p&gt;&lt;strong&gt;What’s new:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hostname &amp;amp; Domain Routing&lt;/strong&gt;: Create routes for individual hostnames (e.g., &lt;code&gt;payroll.acme.local&lt;/code&gt;) or entire domains (e.g., &lt;code&gt;*.acme.local&lt;/code&gt;) and direct their traffic to a specific Tunnel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simplified Zero Trust Policies&lt;/strong&gt;: Build resilient policies in Cloudflare Access and Gateway using stable hostnames, making it dramatically easier to apply per-resource authorization for your private applications.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Precise Egress Control&lt;/strong&gt;: Route traffic for public hostnames (e.g., &lt;code&gt;bank.example.com&lt;/code&gt;) through a specific Tunnel to enforce a dedicated source IP, solving the IP allowlist problem for third-party services.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No More IP Lists&lt;/strong&gt;: This feature makes the workaround of maintaining dynamic IP Lists for Tunnel connections obsolete.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Get started in the Tunnels section of the Zero Trust dashboard with your first &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/private-net/cloudflared/connect-private-hostname/&quot;&gt;private hostname&lt;/a&gt; or &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/egress-policies/egress-cloudflared/&quot;&gt;public hostname&lt;/a&gt; route.&lt;/p&gt;
&lt;p&gt;Learn more in our &lt;a href=&quot;https://blog.cloudflare.com/tunnel-hostname-routing/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;blog post&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 18 Sep 2025 00:00:00 GMT</pubDate><product>Cloudflare Tunnel</product><category>Cloudflare Tunnel</category><category>Cloudflare Tunnel for SASE</category></item><item><title>Workers - Increased vCPU for Workers Builds on paid plans</title><link>https://developers.cloudflare.com/changelog/post/2025-09-07-builds-increased-cpu-paid/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-07-builds-increased-cpu-paid/</guid><description>&lt;p&gt;We recently &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-08-04-builds-increased-disk-size/&quot;&gt;increased the available disk space&lt;/a&gt; from 8 GB to 20 GB for &lt;strong&gt;all&lt;/strong&gt; plans. Building on that improvement, we’re now doubling the CPU power available for paid plans — from 2 vCPU to &lt;strong&gt;4 vCPU&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;These changes continue our focus on making &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/&quot;&gt;Workers Builds&lt;/a&gt; faster and more reliable.&lt;/p&gt;
&lt;div class=&quot;table-scroll&quot; tabindex=&quot;0&quot; role=&quot;region&quot; aria-label=&quot;Table&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Free Plan&lt;/th&gt;
&lt;th&gt;Paid Plans&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;2 vCPU&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4 vCPU&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;performance-improvements&quot;&gt;Performance Improvements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#performance-improvements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fast build times&lt;/strong&gt;: Even single-threaded workloads benefit from having more vCPUs&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2x faster multi-threaded builds&lt;/strong&gt;: Tools like &lt;a href=&quot;https://esbuild.github.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;esbuild&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and &lt;a href=&quot;https://webpack.js.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;webpack&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; can now utilize additional cores, delivering near-linear performance scaling&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All other &lt;a href=&quot;https://developers.cloudflare.com/workers/ci-cd/builds/limits-and-pricing/&quot;&gt;build limits&lt;/a&gt; — including memory, build minutes, and timeout remain unchanged.&lt;/p&gt;</description><pubDate>Thu, 18 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Preview URLs now default to opt-in</title><link>https://developers.cloudflare.com/changelog/post/2025-09-17-update-preview-url-setting/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-17-update-preview-url-setting/</guid><description>
&lt;p&gt;To prevent the accidental exposure of applications, we&apos;ve updated how &lt;a href=&quot;https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/&quot;&gt;Worker preview URLs&lt;/a&gt; (&lt;code&gt;&amp;lt;PREVIEW&amp;gt;-&amp;lt;WORKER_NAME&amp;gt;.&amp;lt;SUBDOMAIN&amp;gt;.workers.dev&lt;/code&gt;) are handled. We made this change to ensure preview URLs are only active when intentionally configured, improving the default security posture of your Workers.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;one-time-update-for-workers-with-workersdev-disabled&quot;&gt;One-Time Update for Workers with workers.dev Disabled&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#one-time-update-for-workers-with-workersdev-disabled&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;We performed a one-time update to disable preview URLs for existing Workers where the &lt;a href=&quot;https://developers.cloudflare.com/workers/configuration/routing/workers-dev/&quot;&gt;workers.dev subdomain&lt;/a&gt; was also disabled.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;If your Worker was affected, its preview URL (&lt;code&gt;&amp;lt;PREVIEW&amp;gt;-&amp;lt;WORKER_NAME&amp;gt;.&amp;lt;SUBDOMAIN&amp;gt;.workers.dev&lt;/code&gt;) will now direct to an informational page explaining this change.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to Re-enable Your Preview URL&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If your preview URL was disabled, you can re-enable it &lt;a href=&quot;https://developers.cloudflare.com/workers/versions-and-deployments/preview-urls/#toggle-preview-urls-enable-or-disable&quot;&gt;via the Cloudflare dashboard&lt;/a&gt; by navigating to your Worker&apos;s Settings page and toggling on the Preview URL.&lt;/p&gt;
&lt;p&gt;Alternatively, you can use Wrangler by adding the &lt;code&gt;preview_urls = true&lt;/code&gt; setting to your Wrangler file and redeploying the Worker.&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;  &quot;preview_urls&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;preview_urls = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; You can set &lt;code&gt;preview_urls = true&lt;/code&gt; 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 &lt;code&gt;preview_urls&lt;/code&gt; to false, ensuring preview URLs are always enabled by explicit choice.&lt;/p&gt;</description><pubDate>Wed, 17 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare One - New AI-Enabled Search for Zero Trust Dashboard</title><link>https://developers.cloudflare.com/changelog/post/2025-09-16-new-ai-enabled-search-for-zero-trust-dashboard/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-16-new-ai-enabled-search-for-zero-trust-dashboard/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1750,height=1568,format=webp/_astro/searchexample.Di8yS8ju.png&quot; alt=&quot;Example search results in the Zero Trust dashboard&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1750&quot; height=&quot;1568&quot;&gt;
&lt;p&gt;&lt;strong&gt;Ask Cloudy&lt;/strong&gt; — 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.&lt;/p&gt;
&lt;p&gt;Cloudy can then stay open with you as you move between pages to build configuration or answer more questions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Find Recents&lt;/strong&gt; — Recent searches and Cloudy questions also have a new tab under Zero Trust Overview.&lt;/p&gt;</description><pubDate>Tue, 16 Sep 2025 00:00:00 GMT</pubDate><product>Cloudflare One</product><category>Cloudflare One</category></item><item><title>DNS - DNS Firewall Analytics — now in the Cloudflare dashboard</title><link>https://developers.cloudflare.com/changelog/post/2025-09-16-DNSFW-Analytics-UI/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-16-DNSFW-Analytics-UI/</guid><description>
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s New&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Access &lt;a href=&quot;https://developers.cloudflare.com/dns/dns-firewall/analytics/&quot;&gt;GraphQL-powered DNS Firewall analytics&lt;/a&gt; directly in the Cloudflare dashboard.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=512,height=284,format=webp/_astro/DNSFW_Analytics_UI.CgjmZFOO.png&quot; alt=&quot;DNS Firewall Analytics UI&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;512&quot; height=&quot;284&quot;&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;explore-four-interactive-panels&quot;&gt;Explore Four Interactive Panels&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#explore-four-interactive-panels&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Query summary&lt;/strong&gt;: Describes trends over time, segmented by dimensions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Query statistics&lt;/strong&gt;: Describes totals, cached/uncached queries, and processing/response times.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS queries by data center&lt;/strong&gt;: Describes global view and the top 10 data centers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Top query statistics&lt;/strong&gt;: Shows a breakdown by key dimensions, with search and expand options (up to top 100 items).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additional features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apply filters and time ranges once. Changes reflect across all panels.&lt;/li&gt;
&lt;li&gt;Filter by dimensions like query name, query type, cluster, data center, protocol (UDP/TCP), IP version, response code/reason, and more.&lt;/li&gt;
&lt;li&gt;Access up to 62 days of historical data with flexible intervals.&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;availability&quot;&gt;Availability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#availability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Available to all DNS Firewall customers as part of their existing subscription.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;where-to-find-it&quot;&gt;Where to Find It&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#where-to-find-it&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;&lt;li&gt;
&lt;p&gt;In the Cloudflare dashboard, go to the &lt;strong&gt;DNS Firewall&lt;/strong&gt; page.&lt;/p&gt;
&lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/dns-firewall/analytics&quot; data-nb-button class=&quot;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&quot; target=&quot;_blank&quot;&gt;Go to &lt;strong&gt;Analytics&lt;/strong&gt;&amp;nbsp;&amp;#8599;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Refer to the &lt;a href=&quot;https://developers.cloudflare.com/dns/dns-firewall/analytics/&quot;&gt;DNS Firewall Analytics&lt;/a&gt; to learn more.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 16 Sep 2025 00:00:00 GMT</pubDate><product>DNS</product><category>DNS</category></item><item><title>Workers - Remote bindings GA - Connect to remote resources (D1, KV, R2, etc.) during local development</title><link>https://developers.cloudflare.com/changelog/post/2025-09-16-remote-bindings-ga/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-16-remote-bindings-ga/</guid><description>
&lt;p&gt;Three months ago &lt;a href=&quot;https://developers.cloudflare.com/changelog/2025-06-18-remote-bindings-beta/&quot;&gt;we announced the public beta&lt;/a&gt; of &lt;a href=&quot;https://developers.cloudflare.com/workers/local-development/#remote-bindings&quot;&gt;remote bindings&lt;/a&gt; for local development. Now, we&apos;re excited to say that it&apos;s available for everyone in Wrangler, Vite, and Vitest without using an experimental flag!&lt;/p&gt;
&lt;p&gt;With remote bindings, you can now connect to deployed resources like &lt;a href=&quot;https://developers.cloudflare.com/r2/&quot;&gt;R2 buckets&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/d1/&quot;&gt;D1 databases&lt;/a&gt; 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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-configuration&quot;&gt;Example configuration&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-configuration&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To enable remote bindings, add &lt;code&gt;&quot;remote&quot; : true&lt;/code&gt; to each binding that you want to rely on a remote resource running on Cloudflare:&lt;/p&gt;
&lt;div data-nb-tabs data-nb-sync-key=&quot;wranglerConfig&quot; class&gt;&lt;div class=&quot;relative flex border-b border-border&quot; role=&quot;tablist&quot; data-nb-tabs-list&gt;&lt;span class=&quot;bg-primary pointer-events-none absolute -bottom-px h-0.5 rounded-t-sm transition-[left,width] duration-200 ease-out&quot; data-nb-tabs-indicator aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;mt-3&quot;&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.jsonc&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;jsonc&quot; data-nb-lang=&quot;jsonc&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Set this to today&apos;s date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;compatibility_date&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-08-14&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;	&quot;r2_buckets&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;bucket_name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;screenshots-bucket&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;binding&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;screenshots_bucket&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;			&quot;remote&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div role=&quot;tabpanel&quot; data-nb-tabs-content data-nb-tab-label=&quot;wrangler.toml&quot; class&gt;&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;toml&quot; data-nb-lang=&quot;toml&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;name = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;my-worker&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Set this to today&apos;s date&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;compatibility_date = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;2026-08-14&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;[[&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;r2_buckets&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;bucket_name = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;screenshots-bucket&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;binding = &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;screenshots_bucket&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;remote = &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/ui/tabs/Tabs.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;
&lt;p&gt;When remote bindings are configured, your Worker &lt;strong&gt;still executes locally&lt;/strong&gt;, but all binding calls are proxied to the deployed resource that runs on Cloudflare&apos;s network.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You can &lt;a href=&quot;https://developers.cloudflare.com/workers/local-development/#remote-bindings&quot;&gt;try out remote bindings&lt;/a&gt; for local development today with:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler v4.37.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/vite-plugin/&quot;&gt;Cloudflare Vite Plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.cloudflare.com/workers/testing/vitest-integration/&quot;&gt;Cloudflare Vitest Plugin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 16 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>WAF - WAF Release - 2025-09-15</title><link>https://developers.cloudflare.com/changelog/post/2025-09-15-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-15-waf-release/</guid><description>
&lt;p&gt;&lt;strong&gt;This week&apos;s update&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This week&apos;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These vulnerabilities expose organizations to serious risks, including credential theft, unauthorized access, and full system compromise. Argo CD&apos;s flaw may expose Kubernetes secrets, DataEase exploitation could give attackers remote execution capabilities, and Sitecore&apos;s disclosure issue increases the likelihood of sensitive data leakage and business impact.&lt;/p&gt;
&lt;p&gt;Administrators are strongly advised to apply vendor patches immediately, rotate exposed credentials, and review access controls to mitigate these risks.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;199cce9ab21e40bcb535f01b2ee2085f&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...2ee2085f&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;100646&lt;/td&gt;&lt;td&gt;Argo CD - Information Disclosure - CVE:CVE-2025-55190s&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;e513bb21b6a44f9cbfcd2462f5e20788&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...f5e20788&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100874&lt;/td&gt;&lt;td&gt;DataEase - JNDI injection - CVE:CVE-2025-57773&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;be097f5a71a04f27aa87b60d005a12fd&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...005a12fd&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100880&lt;/td&gt;&lt;td&gt;Sitecore - Information Disclosure - CVE:CVE-2025-53694&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 15 Sep 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Email security - Regional Email Processing for Germany, India, or Australia</title><link>https://developers.cloudflare.com/changelog/post/2025-09-11-regional-email-processing-gia/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-11-regional-email-processing-gia/</guid><description>&lt;p&gt;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: &lt;strong&gt;MX&lt;/strong&gt;, &lt;strong&gt;BCC&lt;/strong&gt;, and &lt;strong&gt;Journaling&lt;/strong&gt;.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What’s new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Customers can now select where their email is processed. The following regions are supported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Germany&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;India&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Australia&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Global processing remains the default option, providing flexibility to meet both compliance requirements or operational preferences.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;how-to-use-it&quot;&gt;How to use it&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#how-to-use-it&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;When onboarding a domain with MX, BCC, or Journaling:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select the desired processing location (Germany, India, or Australia).&lt;/li&gt;
&lt;li&gt;The UI will display updated processing addresses specific to that region.&lt;/li&gt;
&lt;li&gt;For MX onboarding, if your domain is managed by Cloudflare, you can automatically update MX records directly from the UI.&lt;/li&gt;
&lt;/ol&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;availability&quot;&gt;Availability&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#availability&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;This feature is available across these Email security packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Advantage&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enterprise + PhishGuard&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-next&quot;&gt;What’s next&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-next&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;We’re expanding the list of processing locations to match our &lt;a href=&quot;https://developers.cloudflare.com/data-localization/&quot;&gt;Data Localization Suite (DLS)&lt;/a&gt; footprint, giving customers the broadest set of regional options in the market without the complexity of self-hosting.&lt;/p&gt;</description><pubDate>Thu, 11 Sep 2025 23:15:00 GMT</pubDate><product>Email security</product><category>Email security</category></item><item><title>D1, Workers - D1 automatically retries read-only queries</title><link>https://developers.cloudflare.com/changelog/post/2025-09-11-d1-automatic-read-retries/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-11-d1-automatic-read-retries/</guid><description>&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/d1/worker-api/return-object/#d1result&quot;&gt;response metadata&lt;/a&gt; property &lt;code&gt;total_attempts&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;At the moment, only read-only queries are retried, that is, queries containing only the following SQLite keywords: &lt;code&gt;SELECT&lt;/code&gt;, &lt;code&gt;EXPLAIN&lt;/code&gt;, &lt;code&gt;WITH&lt;/code&gt;. Queries containing any &lt;a href=&quot;https://sqlite.org/lang_keywords.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SQLite keyword&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; that leads to database writes are not retried.&lt;/p&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/d1/best-practices/retry-queries/&quot;&gt;retries in their own code&lt;/a&gt; for queries that are not read-only but are idempotent according to the business logic of the application.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1600,height=946,format=webp/_astro/d1-auto-retry-success-ratio.yPw8B0tB.png&quot; alt=&quot;D1 automatically query retries success ratio&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1600&quot; height=&quot;946&quot;&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</description><pubDate>Thu, 11 Sep 2025 00:00:00 GMT</pubDate><product>D1</product><category>D1</category><category>Workers</category></item><item><title>Gateway, Cloudflare WAN, Cloudflare Tunnel for SASE - DNS filtering for private network onramps</title><link>https://developers.cloudflare.com/changelog/post/2025-09-11-dns-filtering-for-private-network-onramps/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-11-dns-filtering-for-private-network-onramps/</guid><description>&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/zero-trust/cloudflare-gateway/#dns-filtering&quot;&gt;Magic WAN&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-mesh/routes/#dns-filtering&quot;&gt;WARP Connector&lt;/a&gt; users can now securely route their DNS traffic to the Gateway resolver without exposing traffic to the public Internet.&lt;/p&gt;
&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/resolver-policies/#internal-dns&quot;&gt;Internal DNS&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/egress-policies/#selector-prerequisites&quot;&gt;hostname-based policies&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To configure DNS filtering, change your Magic WAN or WARP Connector DNS settings to use Cloudflare&apos;s shared resolver IPs, &lt;code&gt;172.64.36.1&lt;/code&gt; and &lt;code&gt;172.64.36.2&lt;/code&gt;. Once you configure DNS resolution and filtering, you can use &lt;em&gt;Source Internal IP&lt;/em&gt; as a traffic selector in your &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/traffic-policies/resolver-policies/&quot;&gt;resolver policies&lt;/a&gt; for routing private DNS traffic to your &lt;a href=&quot;https://developers.cloudflare.com/dns/internal-dns/&quot;&gt;Internal DNS&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 11 Sep 2025 00:00:00 GMT</pubDate><product>Gateway</product><category>Gateway</category><category>Cloudflare WAN</category><category>Cloudflare Tunnel for SASE</category></item><item><title>Log Explorer - Contextual pivots</title><link>https://developers.cloudflare.com/changelog/post/2025-09-11-contextual-pivots/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-11-contextual-pivots/</guid><description>&lt;p&gt;Directly from &lt;a href=&quot;https://developers.cloudflare.com/log-explorer/log-search/&quot;&gt;Log Search&lt;/a&gt; results, customers can pivot to other parts of the Cloudflare dashboard to immediately take action as a result of their investigation.&lt;/p&gt;
&lt;p&gt;From the &lt;code&gt;http_requests&lt;/code&gt; or &lt;code&gt;fw_events&lt;/code&gt; 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.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1038,height=486,format=webp/_astro/investigate-ip-address.BMVSMzDi.png&quot; alt=&quot;Investigate IP address&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1038&quot; height=&quot;486&quot;&gt;
&lt;p&gt;Easily learn about error codes by linking directly to our documentation from the &lt;strong&gt;EdgeResponseStatus&lt;/strong&gt; or &lt;strong&gt;OriginResponseStatus&lt;/strong&gt; fields.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1186,height=476,format=webp/_astro/view-documentation.Cem5QgeO.png&quot; alt=&quot;View documentation&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1186&quot; height=&quot;476&quot;&gt;
&lt;p&gt;From the &lt;code&gt;gateway_http&lt;/code&gt; dataset, click on a &lt;strong&gt;policyid&lt;/strong&gt; to link directly to the Zero Trust dashboard to review or make changes to a specific Gateway policy.&lt;/p&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1274,height=498,format=webp/_astro/policyid.CVjEdahj.png&quot; alt=&quot;View policy&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1274&quot; height=&quot;498&quot;&gt;</description><pubDate>Thu, 11 Sep 2025 00:00:00 GMT</pubDate><product>Log Explorer</product><category>Log Explorer</category></item><item><title>Log Explorer - New results table view</title><link>https://developers.cloudflare.com/changelog/post/2025-09-11-new-results-table-view/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-11-new-results-table-view/</guid><description>&lt;p&gt;The results table view of &lt;strong&gt;Log Search&lt;/strong&gt; has been updated with additional functionality and a more streamlined user experience. Users can now easily:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remove/add columns.&lt;/li&gt;
&lt;li&gt;Resize columns.&lt;/li&gt;
&lt;li&gt;Sort columns.&lt;/li&gt;
&lt;li&gt;Copy values from any field.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=1786,height=342,format=webp/_astro/new-table.C2Q8mWJ9.png&quot; alt=&quot;New results table view&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1786&quot; height=&quot;342&quot;&gt;</description><pubDate>Thu, 11 Sep 2025 00:00:00 GMT</pubDate><product>Log Explorer</product><category>Log Explorer</category></item><item><title>Workers - Worker version rollback limit increased from 10 to 100</title><link>https://developers.cloudflare.com/changelog/post/2025-09-11-increased-version-rollback-limit/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-11-increased-version-rollback-limit/</guid><description>&lt;p&gt;The number of recent versions available for a Worker rollback has been increased from 10 to 100.&lt;/p&gt;
&lt;p&gt;This allows you to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Promote any of the 100 most recent versions to be the active deployment.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Split traffic using &lt;a href=&quot;https://developers.cloudflare.com/workers/versions-and-deployments/gradual-deployments/&quot;&gt;gradual deployments&lt;/a&gt; between your latest code and any of the 100 most recent versions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can do this through the Cloudflare dashboard or with &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/commands/general/#rollback&quot;&gt;Wrangler&apos;s rollback command&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Learn more about &lt;a href=&quot;https://developers.cloudflare.com/workers/versions-and-deployments/&quot;&gt;versioned deployments&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/versions-and-deployments/rollbacks/&quot;&gt;rollbacks&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 11 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare One Client - WARP client for Windows (version 2025.7.106.1)</title><link>https://developers.cloudflare.com/changelog/post/2025-09-10-warp-windows-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-10-warp-windows-beta/</guid><description>&lt;p&gt;A new Beta release for the Windows WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/&quot;&gt;beta releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes and improvements including enhancements to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode&quot;&gt;Proxy mode&lt;/a&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/&quot;&gt;WARP mode&lt;/a&gt; or all devices matching the profile will lose connectivity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode&quot;&gt;Proxy mode&lt;/a&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/&quot;&gt;WARP mode&lt;/a&gt; or all devices matching the profile will lose connectivity.&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Improvements to maintain Global WARP Override settings when switching between organization configurations.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#device-tunnel-protocol&quot;&gt;MASQUE protocol&lt;/a&gt; is now the default protocol for all new WARP device profiles.&lt;/li&gt;
&lt;li&gt;Improvement to limit idle connections in DoH mode to avoid unnecessary resource usage that can lead to DoH requests not resolving.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://support.microsoft.com/en-us/topic/july-8-2025-kb5062553-os-build-26100-4652-523e69cb-051b-43c6-8376-6a76d6caeefd&quot;&gt;Windows 11 24H2 KB5062553&lt;/a&gt; or higher for resolution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server&quot;&gt;Route traffic to fallback server&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;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 &lt;a href=&quot;https://www.microsoft.com/en-us/wdsi/definitions/antimalware-definition-release-notes?requestVersion=1.429.19.0&quot;&gt;version 1.429.19.0&lt;/a&gt; or later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DNS resolution may be broken when the following conditions are all true:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WARP is in Secure Web Gateway without DNS filtering (tunnel-only) mode.&lt;/li&gt;
&lt;li&gt;A custom DNS server address is configured on the primary network adapter.&lt;/li&gt;
&lt;li&gt;The custom DNS server address on the primary network adapter is changed while WARP is connected.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To work around this issue, reconnect the WARP client by toggling off and back on.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Wed, 10 Sep 2025 14:09:30 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Cloudflare One Client - WARP client for macOS (version 2025.7.106.1)</title><link>https://developers.cloudflare.com/changelog/post/2025-09-10-warp-macos-beta/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-10-warp-macos-beta/</guid><description>&lt;p&gt;A new Beta release for the macOS WARP client is now available on the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/download/beta-releases/&quot;&gt;beta releases downloads page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This release contains minor fixes and improvements including enhancements to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode&quot;&gt;Proxy mode&lt;/a&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/&quot;&gt;WARP mode&lt;/a&gt; or all devices matching the profile will lose connectivity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changes and improvements&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enhancements to &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/#local-proxy-mode&quot;&gt;Proxy mode&lt;/a&gt; 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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/modes/&quot;&gt;WARP mode&lt;/a&gt; or all devices matching the profile will lose connectivity.&lt;/li&gt;
&lt;li&gt;Fixed a bug preventing the &lt;code&gt;warp-diag captive-portal&lt;/code&gt; command from running successfully due to the client not parsing SSID on macOS.&lt;/li&gt;
&lt;li&gt;Improvements to maintain Global WARP Override settings when switching between organization configurations.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/settings/#device-tunnel-protocol&quot;&gt;MASQUE protocol&lt;/a&gt; is now the default protocol for all new WARP device profiles.&lt;/li&gt;
&lt;li&gt;Improvement to limit idle connections in DoH mode to avoid unnecessary resource usage that can lead to DoH requests not resolving.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Known issues&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;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 &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-one/team-and-resources/devices/cloudflare-one-client/configure/route-traffic/local-domains/#route-traffic-to-fallback-server&quot;&gt;Route traffic to fallback server&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description><pubDate>Wed, 10 Sep 2025 14:09:02 GMT</pubDate><product>Cloudflare One Client</product><category>Cloudflare One Client</category></item><item><title>Agents, Workers - Agents SDK v0.1.0 and workers-ai-provider v2.0.0 with AI SDK v5 support</title><link>https://developers.cloudflare.com/changelog/post/2025-09-03-agents-sdk-beta-v5/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-03-agents-sdk-beta-v5/</guid><description>&lt;p&gt;We&apos;ve shipped a new release for the &lt;a href=&quot;https://github.com/cloudflare/agents&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Agents SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; bringing full compatibility with &lt;a href=&quot;https://ai-sdk.dev/docs/introduction&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI SDK v5&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and introducing automatic message migration that handles all legacy formats transparently.&lt;/p&gt;
&lt;p&gt;This release includes improved streaming and tool support, tool confirmation detection (for &quot;human in the loop&quot; systems), enhanced React hooks with automatic tool resolution, improved error handling for streaming responses, and seamless migration utilities that work behind the scenes.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Additionally, we&apos;ve updated workers-ai-provider v2.0.0, the official provider for Cloudflare Workers AI models, to be compatible with AI SDK v5.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;useagentchatoptions&quot;&gt;useAgentChat(options)&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#useagentchatoptions&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Creates a new chat interface with enhanced v5 capabilities.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Basic chat setup&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;messages&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;sendMessage&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;addToolResult&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useAgentChat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	experimental_automaticToolResolution: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	tools,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// With custom tool confirmation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; chat&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; useAgentChat&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	agent,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	experimental_automaticToolResolution: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	toolsRequiringConfirmation: [&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;dangerousOperation&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;automatic-tool-resolution&quot;&gt;Automatic Tool Resolution&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#automatic-tool-resolution&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Tools are automatically categorized based on their configuration:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tools&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Auto-executes (has execute function)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	getLocalTime: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		description: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Get current local time&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		inputSchema: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		execute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; () &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Date&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;toLocaleString&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Requires confirmation (no execute function)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	deleteFile: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		description: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Delete a file from the system&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		inputSchema: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			filename: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;	// Server-executed (no client confirmation)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	analyzeData: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		description: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Analyze dataset on server&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		inputSchema: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ data: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;array&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;()) }),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		serverExecuted: &lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;} &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;satisfies&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; Record&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;AITool&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;&amp;gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;message-handling&quot;&gt;Message Handling&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#message-handling&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Send messages using the new v5 format with parts array:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Text message&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;sendMessage&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	parts: [{ type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, text: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Hello, assistant!&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Multi-part message with file&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;sendMessage&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	parts: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{ type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, text: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Analyze this image:&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{ type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;image&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, image: imageData },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;tool-confirmation-detection&quot;&gt;Tool Confirmation Detection&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#tool-confirmation-detection&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Simplified logic for detecting pending tool confirmations:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; pendingToolCallConfirmation&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; messages.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	m.parts?.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		(&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;part&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; isToolUIPart&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(part) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; part.state &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;===&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;input-available&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Handle tool confirmation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (pendingToolCallConfirmation) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;	await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; addToolResult&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		toolCallId: part.toolCallId,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		tool: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;getToolName&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(part),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		output: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;User approved the action&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;automatic-message-migration&quot;&gt;Automatic Message Migration&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#automatic-message-migration&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Seamlessly handle legacy message formats without code changes.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// All these formats are automatically converted:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Legacy v4 string content&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; legacyMessage&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	content: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Hello world&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Legacy v4 with tool calls&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; legacyWithTools&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;assistant&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	content: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	toolInvocations: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			toolCallId: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;123&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			toolName: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;weather&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			args: { city: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;SF&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			state: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;result&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			result: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Sunny, 72°F&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Automatically becomes v5 format:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//   role: &quot;assistant&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//   parts: [{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//     type: &quot;tool-call&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//     toolCallId: &quot;123&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//     toolName: &quot;weather&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//     args: { city: &quot;SF&quot; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//     state: &quot;result&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//     result: &quot;Sunny, 72°F&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;//   }]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;tool-definition-updates&quot;&gt;Tool Definition Updates&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#tool-definition-updates&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Migrate tool definitions to use the new &lt;code&gt;inputSchema&lt;/code&gt; property.&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Before (AI SDK v4)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tools&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	weather: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		description: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Get weather information&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		parameters: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			city: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		execute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getWeather&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(args.city);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// After (AI SDK v5)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; tools&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	weather: {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		description: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Get weather information&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		inputSchema: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			city: z.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		}),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;		execute&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;			return&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; getWeather&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(args.city);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;cloudflare-workers-ai-integration&quot;&gt;Cloudflare Workers AI Integration&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#cloudflare-workers-ai-integration&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Seamless integration with Cloudflare Workers AI models through the updated workers-ai-provider v2.0.0.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;model-setup-with-workers-ai&quot;&gt;Model Setup with Workers AI&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#model-setup-with-workers-ai&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Use Cloudflare Workers AI models directly in your agent workflows:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { createWorkersAI } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;workers-ai-provider&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { useAgentChat } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;agents/ai-react&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Create Workers AI model (v2.0.0 - same API, enhanced v5 internals)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; model&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; createWorkersAI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	binding: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;})(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/meta/llama-3.2-3b-instruct&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;enhanced-file-and-image-support&quot;&gt;Enhanced File and Image Support&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#enhanced-file-and-image-support&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Workers AI models now support v5 file handling with automatic conversion:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Send images and files to Workers AI models&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;sendMessage&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	role: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;user&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	parts: [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{ type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;text&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;, text: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;Analyze this image:&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; },&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			type: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;file&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			data: imageBuffer,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;			mediaType: &lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;image/jpeg&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Workers AI provider automatically converts to proper format&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;streaming-with-workers-ai&quot;&gt;Streaming with Workers AI&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#streaming-with-workers-ai&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Enhanced streaming support with automatic warning detection:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Streaming with Workers AI models&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; result&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; await&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt; streamText&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	model: &lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;createWorkersAI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;({ binding: env.&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;AI&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; })(&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;@cf/meta/llama-3.2-3b-instruct&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	messages,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;	onChunk&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;: (&lt;/span&gt;&lt;span class=&quot;nb-shiki-1jdh33&quot;&gt;chunk&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;) &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;		// Enhanced streaming with warning handling&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;		console.&lt;/span&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;(chunk);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;	},&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;import-updates&quot;&gt;Import Updates&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#import-updates&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Update your imports to use the new v5 types:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-nb-lang=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// Before (AI SDK v4)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { Message } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { useChat } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai/react&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// After (AI SDK v5)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { UIMessage } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;// or alias for compatibility&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { UIMessage &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; Message } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;ai&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt; { useChat } &lt;/span&gt;&lt;span class=&quot;nb-shiki-1itgoe&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;@ai-sdk/react&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;resources&quot;&gt;Resources&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#resources&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/agents/blob/main/docs/migration-to-ai-sdk-v5.md&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Migration Guide&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; - Comprehensive migration documentation&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ai-sdk.dev/docs/migration-guides/migration-guide-5-0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI SDK v5 Documentation&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; - Official AI SDK migration guide&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/agents-starter/pull/105&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;An Example PR showing the migration from AI SDK v4 to v5&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/agents/issues&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GitHub Issues&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; - Report bugs or request features&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;feedback-welcome&quot;&gt;Feedback Welcome&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#feedback-welcome&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;We&apos;d love your feedback! We&apos;re particularly interested in feedback on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Migration experience&lt;/strong&gt; - How smooth was the upgrade process?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tool confirmation workflow&lt;/strong&gt; - Does the new automatic detection work as expected?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Message format handling&lt;/strong&gt; - Any edge cases with legacy message conversion?&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><product>Agents</product><category>Agents</category><category>Workers</category></item><item><title>Workers - Built with Cloudflare button</title><link>https://developers.cloudflare.com/changelog/post/2025-09-10-built-with-cloudflare-button/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-10-built-with-cloudflare-button/</guid><description>&lt;p&gt;We&apos;ve updated our &quot;Built with Cloudflare&quot; button to make it easier to share that you&apos;re building on Cloudflare with the world. Embed it in your project&apos;s README, blog post, or wherever you want to let people know.&lt;/p&gt;
&lt;img src=&quot;https://workers.cloudflare.com/built-with-cloudflare.svg&quot; alt=&quot;Built with Cloudflare&quot;&gt;
&lt;p&gt;Check out the &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/built-with-cloudflare&quot;&gt;documentation&lt;/a&gt; for usage information.&lt;/p&gt;</description><pubDate>Wed, 10 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Workers - Deploy static sites to Workers without a configuration file</title><link>https://developers.cloudflare.com/changelog/post/2025-09-09-interactive-wrangler-assets/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-09-interactive-wrangler-assets/</guid><description>&lt;p&gt;Deploying static site to Workers is now easier. When you run &lt;code&gt;wrangler deploy [directory]&lt;/code&gt; or &lt;code&gt;wrangler deploy --assets [directory]&lt;/code&gt; without an existing &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/configuration/&quot;&gt;configuration file&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/workers/wrangler/&quot;&gt;Wrangler CLI&lt;/a&gt; now guides you through the deployment process with interactive prompts.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;before-and-after&quot;&gt;Before and after&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#before-and-after&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt; Required remembering multiple flags and parameters&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --assets&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; ./dist&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --compatibility-date&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; 2025-09-09&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; --name&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-project&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt; Simple directory deployment with guided setup&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; dist&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Interactive prompts handle the rest as shown in the example flow below&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;whats-new&quot;&gt;What&apos;s new&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#whats-new&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Interactive prompts for missing configuration:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wrangler detects when you&apos;re trying to deploy a directory of static assets&lt;/li&gt;
&lt;li&gt;Prompts you to confirm the deployment type&lt;/li&gt;
&lt;li&gt;Asks for a project name (with smart defaults)&lt;/li&gt;
&lt;li&gt;Automatically sets the compatibility date to today&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Automatic configuration generation:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creates a &lt;code&gt;wrangler.jsonc&lt;/code&gt; file with your deployment settings&lt;/li&gt;
&lt;li&gt;Stores your choices for future deployments&lt;/li&gt;
&lt;li&gt;Eliminates the need to remember complex command-line flags&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;example-workflow&quot;&gt;Example workflow&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#example-workflow&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-nb-lang=&quot;bash&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Deploy your built static site&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; dist&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Wrangler will prompt:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;✔&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; It&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; looks&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; like&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; you&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; are&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; trying&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; to&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; directory&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; of&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; static&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; assets&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; only.&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; Is&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; correct?&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; …&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; yes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;✔&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; What&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; do&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; you&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; want&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; to&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; name&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; your&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; project?&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; …&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; my-astro-site&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Automatically generates a wrangler.jsonc file and adds it to your project:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;  &quot;name&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;my-astro-site&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;  &quot;compatibility_date&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;2025-09-09&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;  &quot;assets&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;    &quot;directory&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;dist&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-21nrsd&quot;&gt;# Next time you run wrangler deploy, this will use the configuration in your newly generated wrangler.jsonc file&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;wrangler&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; deploy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;requirements&quot;&gt;Requirements&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#requirements&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;You must use Wrangler version 4.24.4 or later in order to use this feature&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Tue, 09 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category></item><item><title>Cloudflare WAN - Custom IKE ID for IPsec Tunnels</title><link>https://developers.cloudflare.com/changelog/post/2025-09-08-custom-ike-id-ipsec-tunnels/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-08-custom-ike-id-ipsec-tunnels/</guid><description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;This feature is available via API only. Customers can read the Magic WAN documentation to learn more about the &lt;a href=&quot;https://developers.cloudflare.com/cloudflare-wan/configuration/common-settings/custom-ike-id-ipsec/&quot;&gt;Custom IKE ID feature and the API call to configure it&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate><product>Cloudflare WAN</product><category>Cloudflare WAN</category></item><item><title>Cloudflare Fundamentals - Reminders about two-factor authentication backup codes</title><link>https://developers.cloudflare.com/changelog/post/2025-09-08-reminders-about-two-factor-authentication-backup-codes/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-08-reminders-about-two-factor-authentication-backup-codes/</guid><description>&lt;p&gt;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&apos;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&apos;t get locked out in the future.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;for-more-information&quot;&gt;For more information&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#for-more-information&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/fundamentals/user-profiles/2fa/&quot;&gt;Two-factor authentication&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate><product>Cloudflare Fundamentals</product><category>Cloudflare Fundamentals</category></item><item><title>WAF - WAF Release - 2025-09-08</title><link>https://developers.cloudflare.com/changelog/post/2025-09-08-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-08-waf-release/</guid><description>
&lt;p&gt;&lt;strong&gt;This week&apos;s update&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;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 &lt;code&gt;next()&lt;/code&gt; calls.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Zhiyuan OA (CVE-2025-34040): An arbitrary file upload vulnerability exists in the Zhiyuan OA platform. Improper validation in the &lt;code&gt;wpsAssistServlet&lt;/code&gt; interface allows unauthenticated attackers to upload crafted files via path traversal, which can be executed on the web server, leading to remote code execution.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;Administrators are strongly advised to apply vendor patches immediately, remove unsupported software, and review authentication and access controls to mitigate these risks.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;7c5812a31fd94996b3299f7e963d7afc&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...963d7afc&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;100007D&lt;/td&gt;&lt;td&gt;Command Injection - Common Attack Commands Args&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule has been merged into the original rule &quot;Command Injection - Common Attack Commands&quot; (ID: &lt;rule-id id=&quot;89557ce9b26e4d4dbf29e90c28345b9b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...28345b9b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;) for New WAF customers only.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;cd528243d6824f7ab56182988230a75b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...8230a75b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100617&lt;/td&gt;&lt;td&gt;Next.js - SSRF - CVE:CVE-2025-57822&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;503b337dac5c409d8f833a6ba22dabf1&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...a22dabf1&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100659_BETA&lt;/td&gt;&lt;td&gt;Common Payloads for Server-Side Template Injection - Beta&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This rule is merged into the original rule &quot;Common Payloads for Server-Side Template Injection&quot; (ID: &lt;rule-id id=&quot;21c7a963e1b749e7b1753238a28a42c4&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...a28a42c4&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;6d24266148f24f5e9fa487f8b416b7ca&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...b416b7ca&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100824B&lt;/td&gt;&lt;td&gt;CrushFTP - Remote Code Execution - CVE:CVE-2025-54309 - 3&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;154b217c43d04f11a13aeff05db1fa6b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...5db1fa6b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100848&lt;/td&gt;&lt;td&gt;ScriptCase - Auth Bypass - CVE:CVE-2025-47227&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;cad6f1c8c6d44ef59929e6532c62d330&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...2c62d330&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100849&lt;/td&gt;&lt;td&gt;ScriptCase - Command Injection - CVE:CVE-2025-47228&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Disabled&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;e7464139fd3e44938b56716bef971afd&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...ef971afd&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100872&lt;/td&gt;&lt;td&gt;WordPress:Plugin:InfiniteWP Client - Missing Authorization - CVE:CVE-2020-8772&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;0181ebb2cc234f2d863412e1bab19b0b&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...bab19b0b&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100873&lt;/td&gt;&lt;td&gt;Sar2HTML - Command Injection - CVE:CVE-2025-34030&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;34d5c7c7b08b40eaad5b2bb3f24c0fbe&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...f24c0fbe&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100875&lt;/td&gt;&lt;td&gt;Zhiyuan OA - Remote Code Execution - CVE:CVE-2025-34040&lt;/td&gt;&lt;td&gt;Log&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a New Detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Mon, 08 Sep 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Cloudflare WAN - Bidirectional tunnel health checks are compatible with all Magic on-ramps</title><link>https://developers.cloudflare.com/changelog/post/2025-09-05-bidirectional-health-check-any-on-ramp/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-05-bidirectional-health-check-any-on-ramp/</guid><description>&lt;p&gt;All bidirectional tunnel health check return packets are accepted by any Magic on-ramp.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;</description><pubDate>Fri, 05 Sep 2025 00:00:00 GMT</pubDate><product>Cloudflare WAN</product><category>Cloudflare WAN</category></item><item><title>Workers AI - Introducing EmbeddingGemma from Google on Workers AI</title><link>https://developers.cloudflare.com/changelog/post/2025-09-05-embeddinggemma/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-05-embeddinggemma/</guid><description>&lt;p&gt;We&apos;re excited to be a launch partner alongside &lt;a href=&quot;https://developers.googleblog.com/en/introducing-embeddinggemma/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Google&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; to bring their newest embedding model, &lt;strong&gt;EmbeddingGemma&lt;/strong&gt;, to Workers AI that delivers best-in-class performance for its size, enabling RAG and semantic search use cases.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/models/embeddinggemma-300m/&quot;&gt;&lt;code&gt;@cf/google/embeddinggemma-300m&lt;/code&gt;&lt;/a&gt; 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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Using EmbeddingGemma in AI Search:&lt;/strong&gt;
Now you can leverage EmbeddingGemma directly through AI Search for your RAG pipelines. EmbeddingGemma&apos;s multilingual capabilities make it perfect for global applications that need to understand and retrieve content across different languages with exceptional accuracy.&lt;/p&gt;
&lt;p&gt;To use EmbeddingGemma for your AI Search projects:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Create&lt;/strong&gt; in the &lt;a href=&quot;https://dash.cloudflare.com/?to=/:account/ai/ai-search&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AI Search dashboard&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Follow the setup flow for your new RAG instance&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Generate Index&lt;/strong&gt; step, open up &lt;strong&gt;More embedding models&lt;/strong&gt; and select &lt;code&gt;@cf/google/embeddinggemma-300m&lt;/code&gt; as your embedding model&lt;/li&gt;
&lt;li&gt;Complete the setup to create an AI Search&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Try it out and let us know what you think!&lt;/p&gt;</description><pubDate>Fri, 05 Sep 2025 00:00:00 GMT</pubDate><product>Workers AI</product><category>Workers AI</category></item><item><title>WAF - WAF Release - 2025-09-04 - Emergency</title><link>https://developers.cloudflare.com/changelog/post/2025-09-04-emergency-waf-release/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-04-emergency-waf-release/</guid><description>
&lt;p&gt;&lt;strong&gt;This week&apos;s update&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key Findings&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CVE-2025-53690: Remote Code Execution through Insecure Deserialization&lt;/li&gt;
&lt;li&gt;CVE-2025-53691: Remote Code Execution through Insecure Deserialization&lt;/li&gt;
&lt;li&gt;CVE-2025-53693: HTML Cache Poisoning through Unsafe Reflections&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;table style=&quot;width: 100%&quot;&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Ruleset&lt;/th&gt;&lt;th&gt;Rule ID&lt;/th&gt;&lt;th&gt;Legacy Rule ID&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;th&gt;Previous Action&lt;/th&gt;&lt;th&gt;New Action&lt;/th&gt;&lt;th&gt;Comments&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;588edc74df1f4609b3c2f7ef0ee2c15e&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...0ee2c15e&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;script type=&quot;module&quot; src=&quot;https://developers.cloudflare.com/home/runner/work/cloudflare-docs/cloudflare-docs/src/components/cf/RuleID.astro?astro&amp;type=script&amp;index=0&amp;lang.ts&quot;&gt;&lt;/script&gt;&lt;/td&gt;&lt;td&gt;100878&lt;/td&gt;&lt;td&gt;Sitecore - Remote Code Execution - CVE:CVE-2025-53691&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;d1bd7563e6254db48ce703807c5b669c&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...7c5b669c&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100631&lt;/td&gt;&lt;td&gt;Sitecore - Cache Poisoning - CVE:CVE-2025-53693&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cloudflare Managed Ruleset&lt;/td&gt;&lt;td&gt;&lt;rule-id id=&quot;ed94c7ce5301411a94a21a096c410240&quot;&gt;&lt;button title=&quot;Copy rule ID&quot; aria-label=&quot;Copy rule ID&quot; class=&quot;border-border bg-muted hover:border-foreground/30 hover:bg-accent inline-flex cursor-copy items-center rounded-md border px-1.5 py-0.5 transition-colors duration-150&quot;&gt;&lt;span class=&quot;font-mono text-[0.8125rem] font-medium&quot;&gt;...6c410240&lt;/span&gt;&lt;/button&gt;&lt;/rule-id&gt;&lt;/td&gt;&lt;td&gt;100879&lt;/td&gt;&lt;td&gt;Sitecore - Remote Code Execution - CVE:CVE-2025-53690&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;Block&lt;/td&gt;&lt;td&gt;This is a new detection&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate><product>WAF</product><category>WAF</category></item><item><title>Workers, Workers for Platforms - Increased static asset limits for Workers</title><link>https://developers.cloudflare.com/changelog/post/2025-09-02-increased-static-asset-limits/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-02-increased-static-asset-limits/</guid><description>&lt;p&gt;You can now upload up to &lt;strong&gt;100,000 static assets&lt;/strong&gt; per Worker version&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Paid and Workers for Platforms users can now upload up to &lt;strong&gt;100,000 static assets&lt;/strong&gt; per Worker version, a 5x increase from the previous limit of 20,000.&lt;/li&gt;
&lt;li&gt;Customers on the free plan still have the same limit as before — 20,000 static assets per version of your Worker&lt;/li&gt;
&lt;li&gt;The individual file size limit of 25 MiB remains unchanged for all customers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This increase allows you to build larger applications with more static assets without hitting limits.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;wrangler&quot;&gt;Wrangler&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#wrangler&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;To take advantage of the increased limits, you must use &lt;strong&gt;Wrangler version 4.34.0 or higher&lt;/strong&gt;.
Earlier versions of Wrangler will continue to enforce the previous 20,000 file limit.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;learn-more&quot;&gt;Learn more&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#learn-more&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;For more information about Workers static assets, see the &lt;a href=&quot;https://developers.cloudflare.com/workers/static-assets/&quot;&gt;Static Assets documentation&lt;/a&gt; and &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/limits/#static-assets&quot;&gt;Platform Limits&lt;/a&gt;.&lt;/p&gt;</description><pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate><product>Workers</product><category>Workers</category><category>Workers for Platforms</category></item><item><title>Workers - A new, simpler REST API for Cloudflare Workers (Beta)</title><link>https://developers.cloudflare.com/changelog/post/2025-09-03-new-workers-api/</link><guid isPermaLink="true">https://developers.cloudflare.com/changelog/post/2025-09-03-new-workers-api/</guid><description>&lt;p&gt;You can now manage &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/methods/create/&quot;&gt;&lt;strong&gt;Workers&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/beta/subresources/workers/models/worker/#(schema)&quot;&gt;&lt;strong&gt;Versions&lt;/strong&gt;&lt;/a&gt;, and &lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/scripts/subresources/content/methods/update/&quot;&gt;&lt;strong&gt;Deployments&lt;/strong&gt;&lt;/a&gt; as separate resources with a new, resource-oriented API (Beta).&lt;/p&gt;
&lt;p&gt;This new API is supported in the &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Terraform provider&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; and the &lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Cloudflare Typescript SDK&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, allowing platform teams to manage a Worker&apos;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.&lt;/p&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;try-it-out&quot;&gt;Try it out&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#try-it-out&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/api/resources/workers/subresources/beta/&quot;&gt;&lt;strong&gt;New beta API endpoints&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/cloudflare-typescript&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Cloudflare TypeScript SDK v5.0.0&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cloudflare/cloudflare-go&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Cloudflare Go SDK v6.0.0&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;strong&gt;Terraform provider v5.9.0&lt;/strong&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;: &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_worker&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; , &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/worker_version&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_worker_version&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt;, and &lt;a href=&quot;https://registry.terraform.io/providers/cloudflare/cloudflare/latest/docs/resources/workers_deployment&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;code&gt;cloudflare_workers_deployments&lt;/code&gt;&lt;span class=&quot;external-link&quot;&gt; ↗&lt;/span&gt;&lt;/a&gt; resources.&lt;/li&gt;
&lt;li&gt;See full examples in our &lt;a href=&quot;https://developers.cloudflare.com/workers/platform/infrastructure-as-code&quot;&gt;Infrastructure as Code (IaC) guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div tabindex=&quot;-1&quot; class=&quot;heading-wrapper level-h4&quot;&gt;&lt;h4 id=&quot;before-eight-endpoints-with-mixed-responsibilities&quot;&gt;Before: Eight+ endpoints with mixed responsibilities&lt;/h4&gt;&lt;a class=&quot;anchor-link&quot; href=&quot;#before-eight-endpoints-with-mixed-responsibilities&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;anchor-icon&quot;&gt;&lt;svg width=&quot;16&quot; height=&quot;16&quot; viewBox=&quot;0 0 24 24&quot;&gt;&lt;path fill=&quot;currentcolor&quot; d=&quot;m12.11 15.39-3.88 3.88a2.52 2.52 0 0 1-3.5 0 2.47 2.47 0 0 1 0-3.5l3.88-3.88a1 1 0 0 0-1.42-1.42l-3.88 3.89a4.48 4.48 0 0 0 6.33 6.33l3.89-3.88a1 1 0 1 0-1.42-1.42Zm8.58-12.08a4.49 4.49 0 0 0-6.33 0l-3.89 3.88a1 1 0 0 0 1.42 1.42l3.88-3.88a2.52 2.52 0 0 1 3.5 0 2.47 2.47 0 0 1 0 3.5l-3.88 3.88a1 1 0 1 0 1.42 1.42l3.88-3.89a4.49 4.49 0 0 0 0-6.33ZM8.83 15.17a1 1 0 0 0 1.1.22 1 1 0 0 0 .32-.22l4.92-4.92a1 1 0 0 0-1.42-1.42l-4.92 4.92a1 1 0 0 0 0 1.42Z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;img src=&quot;https://developers.cloudflare.com/cdn-cgi/image/onerror=redirect,width=7360,height=6176,format=webp/_astro/api-before.VkE1i-Rj.png&quot; alt=&quot;Before&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;7360&quot; height=&quot;6176&quot;&gt;
&lt;p&gt;The existing API was originally designed for simple, one-shot script uploads:&lt;/p&gt;
&lt;figure class=&quot;nb-code-figure&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;pre class=&quot;astro-code astro-code-themes github-light github-dark nb-shiki-c6xiwz&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot; data-nb-lang=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-1t8gfj&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; -X&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; PUT&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;https://api.cloudflare.com/client/v4/accounts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$ACCOUNT_ID&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;/workers/scripts/&lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$SCRIPT_NAME&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;X-Auth-Email: &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_EMAIL&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;X-Auth-Key: &lt;/span&gt;&lt;span class=&quot;nb-shiki-140thh&quot;&gt;$CLOUDFLARE_API_KEY&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    -H&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;Content-Type: multipart/form-data&quot;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    -F&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &apos;metadata={&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;main_module&quot;: &quot;worker.js&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;      &quot;compatibility_date&quot;: &quot;$today$&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt;    }&apos;&lt;/span&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;nb-shiki-dzsirb&quot;&gt;    -F&lt;/span&gt;&lt;span class=&quot;nb-shiki-mdbnqw&quot;&gt; &quot;worker.js=@worker.js;type=application/javascript+module&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;This API worked for creating a basic Worker, uploading all of its code, and deploying it immediately — but came with challenges:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A Worker couldn&apos;t exist without code&lt;/strong&gt;: To create a Worker, you had to upload its code in the same API request. This meant platform teams couldn&apos;t provision Workers with the proper settings, and then hand them off to development teams to deploy the actual code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Several endpoints implicitly created deployments&lt;/strong&gt;: Simple updates like adding a secret or changing a script&apos;s content would implicitly create a new version and immediately deploy it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Updating a setting was confusing&lt;/strong&gt;: 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 reliabl