Skip to content

Commit a8b772a

Browse files
Merge production into device-to-device branch
Resolve conflict in replace-vpn index.mdx: keep both the device-to-device card (from this branch) and the network-to-network card (from production).
2 parents 7408e08 + 3269372 commit a8b772a

File tree

132 files changed

+3163
-435
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

132 files changed

+3163
-435
lines changed

.github/CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package.json @cloudflare/content-engineering
2020

2121
# AI
2222

23+
/src/content/docs/cloudflare-agent/ @dmmulroy @Brayden @cloudflare/pcx-technical-writing
2324
/src/content/docs/agents/ @irvinebroque @rita3ko @elithrar @thomasgauvin @threepointone @whoiskatrin @cloudflare/pcx-technical-writing @cloudflare/ai-agents @cloudflare/dev-plat-leads
2425
/src/content/partials/agents/ @elithrar @rita3ko @irvinebroque @vy-ton @cloudflare/pcx-technical-writing
2526
/src/content/docs/ai-gateway/ @abhishekkankani @palashgo @thebongy @roerohan @kathayl @mchenco @zeke @superhighfives @bfirsh @mattrothenberg @ethulia @cloudflare/pcx-technical-writing

.github/labeler.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ product:agents:
1010
- changed-files:
1111
- any-glob-to-any-file:
1212
- src/content/docs/agents/**
13+
product:cloudflare-agent:
14+
- changed-files:
15+
- any-glob-to-any-file:
16+
- src/content/docs/cloudflare-agent/**
1317
product:ai-crawl-control:
1418
- changed-files:
1519
- any-glob-to-any-file:
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
rules:
2+
- id: directory-entry-wrong-extension
3+
languages: [generic]
4+
message: >-
5+
Directory entry files must use the .yaml extension, not .yml.
6+
Rename this file to use .yaml instead.
7+
(add [skip style guide checks] to commit message to skip)
8+
severity: MEDIUM
9+
paths:
10+
include:
11+
- "/src/content/directory/*.yml"
12+
patterns:
13+
# Match the name field — every directory entry has one, so this fires
14+
# once per .yml file to flag the wrong extension.
15+
- pattern-regex: "^name: "
16+
17+
- id: directory-entry-missing-id
18+
languages: [yaml]
19+
message: >-
20+
Directory entry is missing a required id field.
21+
Run "tools/directory-entry-ids" to generate one automatically.
22+
(add [skip style guide checks] to commit message to skip)
23+
severity: MEDIUM
24+
paths:
25+
include:
26+
- "/src/content/directory/*.yaml"
27+
- "/src/content/directory/*.yml"
28+
patterns:
29+
- pattern: |
30+
name: $NAME
31+
- pattern-not-inside: |
32+
id: ...
33+
...
34+
35+
- id: directory-entry-invalid-id
36+
languages: [generic]
37+
message: >-
38+
Directory entry has an invalid id. The id must be exactly 6 characters
39+
composed only of: abcdefghijkmnopqrstuvwxyzACDEFGHJKLMNPQRTUVWXY34679.
40+
Run "tools/directory-entry-ids" to generate a valid id.
41+
(add [skip style guide checks] to commit message to skip)
42+
severity: MEDIUM
43+
paths:
44+
include:
45+
- "/src/content/directory/*.yaml"
46+
- "/src/content/directory/*.yml"
47+
patterns:
48+
- pattern-regex: "^id: "
49+
- pattern-not-regex: "^id: [abcdefghijkmnopqrstuvwxyzACDEFGHJKLMNPQRTUVWXY34679]{6}$"

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@
146146
"wrangler": "4.58.0"
147147
},
148148
"engines": {
149-
"npm": "10.9.4",
149+
"npm": "10.x",
150150
"node": "22.x"
151151
},
152152
"packageManager": "npm@10.9.4+sha512.3a7506f37e85c1ba1021baad79f0cd9724748131f321fc117c4dc3ba235ec01be7327584a41d15117c01945560aa9373220628fcc1e1dddd877a5fe9b336a900"

public/__redirects

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2248,6 +2248,7 @@
22482248
/cloudflare-one/connections/connect-networks/install-and-setup/tunnel-guide/ /cloudflare-one/connections/connect-networks/get-started/ 301
22492249
/cloudflare-one/connections/connect-networks/downloads/system-requirements/ /cloudflare-one/connections/connect-networks/configure-tunnels/tunnel-availability/system-requirements/ 301
22502250
/cloudflare-one/networks/connectors/cloudflare-tunnel/routing-to-tunnel/lb/ /cloudflare-one/networks/connectors/cloudflare-tunnel/routing-to-tunnel/public-load-balancers/ 301
2251+
/cloudflare-one/networks/routes/ /cloudflare-one/networks/routes/add-routes/ 301
22512252
/cloudflare-one/tutorials/vnc-client-in-browser/ /cloudflare-one/networks/connectors/cloudflare-tunnel/use-cases/vnc-browser-rendering/ 301
22522253
/cloudflare-one/policies/data-loss-prevention/dlp-policies/payload-logging/ /cloudflare-one/policies/data-loss-prevention/dlp-policies/logging-options/#log-the-payload-of-matched-rules 301
22532254
/cloudflare-one/connections/connect-apps/configuration/private-networks/ /cloudflare-one/connections/connect-networks/private-net/ 301
@@ -2559,6 +2560,7 @@
25592560
# WAF
25602561
/waf/managed-rulesets/* /waf/managed-rules/:splat 301
25612562
/waf/custom-rulesets/* /waf/account/custom-rulesets/:splat 301
2563+
/waf/detections/firewall-for-ai/* /waf/detections/ai-security-for-apps/:splat 301
25622564
/waf/exposed-credentials-check/* /waf/managed-rules/check-for-exposed-credentials/:splat 301
25632565
/waf/security-events/* /waf/analytics/security-events/:splat 301
25642566
/waf/change-log/2019-* /waf/change-log/ 301

src/components/SubtractIPCalculator.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,23 +7,23 @@ export default function SubtractIPCalculator({
77
}: {
88
defaults: {
99
base?: string;
10-
exclude?: string[];
10+
subtract?: string[];
1111
};
1212
}) {
1313
const [base, setBase] = useState(defaults?.base ?? "");
14-
const [exclude, setExclude] = useState<string[]>(defaults?.exclude ?? []);
14+
const [subtract, setSubtract] = useState<string[]>(defaults?.subtract ?? []);
1515

1616
const [result, setResult] = useState<string[]>([]);
1717

1818
function calculate() {
19-
setResult(excludeCidr(base, exclude));
19+
setResult(excludeCidr(base, subtract));
2020
track("interacted with docs calculator", { value: "split ip calculator" });
2121
}
2222

2323
function disableButton() {
2424
try {
2525
parseCidr(base);
26-
exclude.map((cidr) => parseCidr(cidr));
26+
subtract.map((cidr) => parseCidr(cidr));
2727

2828
return false;
2929
} catch {
@@ -49,11 +49,11 @@ export default function SubtractIPCalculator({
4949
/>
5050
</label>
5151
<label>
52-
<strong>Excluded CIDRs: </strong>
52+
<strong>Subtracted CIDRs: </strong>
5353
<input
5454
type="text"
55-
value={exclude}
56-
onChange={(e) => setExclude(e.target.value.split(","))}
55+
value={subtract}
56+
onChange={(e) => setSubtract(e.target.value.split(","))}
5757
/>
5858
</label>
5959
</div>

src/content/changelog/access/2026-02-17-clientless-access-for-private-apps.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ A new **Allow clientless access** setting makes it easier to connect users witho
1010

1111
![Allow clientless access setting in the Cloudflare One dashboard](~/assets/images/changelog/access/allow-clientless-access.png)
1212

13-
Previously, to provide clientless access to a private hostname or IP without a [published application](/cloudflare-one/networks/routes/#add-a-published-application-route), you had to create a separate [bookmark application](/cloudflare-one/access-controls/applications/bookmarks/) pointing to a prefixed [Clientless Web Isolation](/cloudflare-one/remote-browser-isolation/setup/clientless-browser-isolation/) URL (for example, `https://<your-teamname>.cloudflareaccess.com/browser/https://10.0.0.1/`). This bookmark was visible to all users in the App Launcher, regardless of whether they had access to the underlying application.
13+
Previously, to provide clientless access to a private hostname or IP without a [published application](/cloudflare-one/networks/routes/add-routes/#add-a-published-application-route), you had to create a separate [bookmark application](/cloudflare-one/access-controls/applications/bookmarks/) pointing to a prefixed [Clientless Web Isolation](/cloudflare-one/remote-browser-isolation/setup/clientless-browser-isolation/) URL (for example, `https://<your-teamname>.cloudflareaccess.com/browser/https://10.0.0.1/`). This bookmark was visible to all users in the App Launcher, regardless of whether they had access to the underlying application.
1414

1515
Now, you can manage clientless access directly within your [private self-hosted application](/cloudflare-one/access-controls/applications/non-http/self-hosted-private-app/). When **Allow clientless access** 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 [remote browser permissions](/cloudflare-one/remote-browser-isolation/setup/clientless-browser-isolation/) to open the link.
1616

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
title: New Vulnerability Scanner for API Shield
3+
description: Detect Broken Object Level Authorization (BOLA) vulnerabilities in your APIs using the new Vulnerability Scanner.
4+
date: 2026-03-09
5+
---
6+
7+
Introducing Cloudflare's Web and API Vulnerability Scanner (Open Beta)
8+
9+
Cloudflare is launching the [Open Beta of the **Web and API Vulnerability Scanner**](https://blog.cloudflare.com/vulnerability-scanner) for all [API Shield](/api-shield/) customers. This new, stateful Dynamic Application Security Testing (DAST) platform helps teams proactively find logic flaws in their APIs.
10+
11+
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.
12+
13+
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.
14+
15+
**Access**: 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.
16+
17+
**Documentation**: Refer to the [developer documentation](/api-shield/security/vulnerability-scanner/) to start scanning your endpoints today.

src/content/changelog/browser-rendering/2026-03-10-br-crawl-endpoint.mdx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ products:
66
date: 2026-03-10
77
---
88

9-
You can now crawl an entire website with a single API call using [Browser Rendering](/browser-rendering/)'s new [`/crawl` endpoint](/browser-rendering/rest-api/crawl-endpoint/), 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. This is great for training models, building RAG pipelines, and researching or monitoring content across a site.
9+
_Edit: this post has been edited to clarify crawling behavior with respect to site guidance._
10+
11+
You can now crawl an entire website with a single API call using [Browser Rendering](/browser-rendering/)'s new [`/crawl` endpoint](/browser-rendering/rest-api/crawl-endpoint/), 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 [signed-agent](https://developers.cloudflare.com/bots/concepts/bot/signed-agents/) that respects robots.txt and [AI Crawl Control](https://www.cloudflare.com/ai-crawl-control/) 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.
1012

1113
Crawl jobs run asynchronously. You submit a URL, receive a job ID, and check back for results as pages are processed.
1214

@@ -33,7 +35,9 @@ Key features:
3335
- **Static mode** - Set `render: false` to fetch static HTML without spinning up a browser, for faster crawling of static sites
3436
- **Well-behaved bot** - Honors `robots.txt` directives, including `crawl-delay`
3537

36-
Available on both the Workers Free and Paid plans.
38+
Available on both the Workers Free and Paid plans.
39+
40+
**Note**: the /crawl endpoint cannot bypass Cloudflare bot detection or captchas, and self-identifies as a bot.
3741

3842
To get started, refer to the [crawl endpoint documentation](/browser-rendering/rest-api/crawl-endpoint/).
3943
If you are setting up your own site to be crawled, review the [robots.txt and sitemaps best practices](/browser-rendering/reference/robots-txt/).
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
---
2+
title: JSON responses and RFC 9457 support for Cloudflare 1xxx errors
3+
description: "Cloudflare-generated 1xxx errors now return structured JSON when requested with 'Accept: application/json' or 'Accept: application/problem+json', following RFC 9457 (Problem Details for HTTP APIs)."
4+
products:
5+
- fundamentals
6+
date: 2026-03-11
7+
---
8+
9+
Cloudflare-generated 1xxx errors now return structured JSON when clients send `Accept: application/json` or `Accept: application/problem+json`. JSON responses follow [RFC 9457 (Problem Details for HTTP APIs)](https://www.rfc-editor.org/rfc/rfc9457), so any HTTP client that understands Problem Details can parse the base members without Cloudflare-specific code.
10+
11+
## Breaking change
12+
13+
The Markdown frontmatter field `http_status` has been renamed to `status`. Agents consuming Markdown frontmatter should update parsers accordingly.
14+
15+
## Changes
16+
17+
**JSON format.** Clients sending `Accept: application/json` or `Accept: application/problem+json` now receive a structured JSON object with the same operational fields as Markdown frontmatter, plus RFC 9457 standard members.
18+
19+
**RFC 9457 standard members (JSON only):**
20+
21+
- `type` — URI pointing to Cloudflare documentation for the specific error code
22+
- `status` — HTTP status code (matching the response status)
23+
- `title` — short, human-readable summary
24+
- `detail` — human-readable explanation specific to this occurrence
25+
- `instance` — Ray ID identifying this specific error occurrence
26+
27+
**Field renames:**
28+
29+
- `http_status` -> `status` (JSON and Markdown)
30+
- `what_happened` -> `detail` (JSON only — Markdown prose sections are unchanged)
31+
32+
**Content-Type mirroring.** Clients sending `Accept: application/problem+json` receive `Content-Type: application/problem+json; charset=utf-8` back; `Accept: application/json` receives `application/json; charset=utf-8`. Same body in both cases.
33+
34+
## Negotiation behavior
35+
36+
| Request header sent | Response format |
37+
| ----------------------------------------------- | ---------------------------------------------- |
38+
| `Accept: application/json` | JSON (`application/json` content type) |
39+
| `Accept: application/problem+json` | JSON (`application/problem+json` content type) |
40+
| `Accept: application/json, text/markdown;q=0.9` | JSON |
41+
| `Accept: text/markdown` | Markdown |
42+
| `Accept: text/markdown, application/json` | Markdown (equal `q`, first-listed wins) |
43+
| `Accept: */*` | HTML (default) |
44+
45+
## Availability
46+
47+
Available now for Cloudflare-generated 1xxx errors.
48+
49+
## Get started
50+
51+
```bash
52+
curl -s --compressed -H "Accept: application/json" -A "TestAgent/1.0" -H "Accept-Encoding: gzip, deflate" "<YOUR_DOMAIN>/cdn-cgi/error/1015" | jq .
53+
```
54+
55+
```bash
56+
curl -s --compressed -H "Accept: application/problem+json" -A "TestAgent/1.0" -H "Accept-Encoding: gzip, deflate" "<YOUR_DOMAIN>/cdn-cgi/error/1015" | jq .
57+
```
58+
59+
References:
60+
- [RFC 9457 — Problem Details for HTTP APIs](https://www.rfc-editor.org/rfc/rfc9457)
61+
- [Cloudflare 1xxx error documentation](/support/troubleshooting/http-status-codes/cloudflare-1xxx-errors/)

0 commit comments

Comments
 (0)