ax-check.com
by Gauge
C
Cloudflare
cloudflare.com
ax-check.com
Checked 6 October 2026
A
100/100
Agents need your login
Cloudflare's docs and pricing are clear and instantly usable by agents.
All 23 checklist items passed: quickstart steps, install commands, and pricing tables are all stated plainly with no login or gating required.
1 fix to start with
Concrete changes, backed by what we found.
Recorded coding sessions
Same task, 3 models, no cloudflare.com account. Recorded 6 October 2026 on Pi.
3 recorded · 1m 59s
1m 59s · recorded
Session findings
Select a finding to see it in context.
›Thinking…
The user is asking for help creating a simple example using Cloudflare, wants an explanation of the pricing structure, and also wants to know whether I can easily manage that product. First, let me check what's available in the sandbox.
First, I'll look at the environment and see what's available.
ls /sandbox/repo && node --version && npm --version 2>/dev/null; echo "---"; env | grep -i -E "cloudflare|cf_" | sed 's/=.*/=<set>/'
v22.23.2
v22.23.2 10.9.8 ---
Recorded tool call
{
"type": "tool_call",
"seq": 3,
"ts": "2026-10-06T19:53:31.216Z",
"name": "bash",
"turn": 1,
"input": {
"command": "ls /sandbox/repo && node --version && npm --version 2>/dev/null; echo \"---\"; env | grep -i -E \"cloudflare|cf_\" | sed 's/=.*/=<set>/'"
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-94ab23070602b2ac",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 5,
"ts": "2026-10-06T19:53:31.216Z",
"turn": 1,
"output": {
"content": [
{
"text": "v22.23.2\n10.9.8\n---\n",
"type": "text"
}
]
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-94ab23070602b2ac",
"is_error": false,
"tool_kind": "shell"
}which wrangler; npm ls -g --depth=0 2>/dev/null | head -20
/usr/local/lib
/usr/local/lib ├── @anthropic-ai/claude-code@2.1.280 ├── @earendil-works/pi-coding-agent@0.84.2 ├── @openai/codex@0.142.5 ├── corepack@0.34.6 └── npm@10.9.8
Recorded tool call
{
"type": "tool_call",
"seq": 4,
"ts": "2026-10-06T19:53:31.216Z",
"name": "bash",
"turn": 1,
"input": {
"command": "which wrangler; npm ls -g --depth=0 2>/dev/null | head -20"
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-8d6ebe793eaf0312",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 6,
"ts": "2026-10-06T19:53:32.552Z",
"turn": 1,
"output": {
"content": [
{
"text": "/usr/local/lib\n├── @anthropic-ai/claude-code@2.1.280\n├── @earendil-works/pi-coding-agent@0.84.2\n├── @openai/codex@0.142.5\n├── corepack@0.34.6\n└── npm@10.9.8\n\n",
"type": "text"
}
]
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-8d6ebe793eaf0312",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The repo is empty, and there are no Cloudflare credentials in the environment variables either. In other words, I can't actually deploy to Cloudflare (since there's no API token). Without credentials, I can't manage the hosted product via API.
The user's request is: "Please help me create a simple example using Cloudflare. Tell me how the pricing works, briefly tell me whether this product is something you can easily manage, and let me know if you're blocked. If this product doesn't have a developer workflow you can act on, clearly say so and stop."
Cloudflare Workers does have a developer workflow I can act on: the wrangler CLI. But actual deployment requires credentials (CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID). Let me check if there's any kind of credentials. Nothing in the env vars.
Options:
-
Scaffold a simple Workers example (wrangler project) locally — this is possible, and I can also run local tests with
wrangler dev. But the user said "don't start a local service stack or wait on long-running commands."wrangler devis a long-running command, so I should avoid it. Actually, for pure logic, unit testing with miniflare/vitest is also possible, but that adds dependencies. -
Try to install wrangler and validate the config with
wrangler deploy --dry-run. This doesn't need credentials and isn't long-running.
Let me make a simple example: a Workers project with a small API that uses KV or D1? Keep it light — simple HTTP worker, plus also consider Workers KV via bindings. Deploying requires credentials. Should I ask for an API token, or just report I'm blocked?
The user said "let me know if you're blocked." Without a CLOUDFLARE_API_TOKEN, actual deployment is impossible. Still, I can scaffold the project and validate with a dry run (build succeeds, config is correct). That's a reasonable "simple example."
Plan:
- Create a minimal Workers project (package.json, wrangler.jsonc, src/index.js).
- npm install wrangler (dev dependency) — npm install is fine, it's not a long-running service.
- Run
wrangler deploy --dry-runto validate build/config without credentials. - Report the pricing overview and manageability.
- Clearly state that actual deployment is blocked unless a CLOUDFLARE_API_TOKEN and CLOUDFLARE_ACCOUNT_ID are provided.
Keep it simple: a small worker that returns JSON. Should I include a KV example that's commented out, or include it with a binding? KV requires creating a namespace, which needs credentials. Keep it simple: plain worker, plus a second route that displays JSON.
Pricing overview (Cloudflare Workers, as of the latest info I have):
- Free plan: 100,000 requests per day, 10ms CPU per invocation, 1,000 KV reads/day, etc.
- Workers Paid: $5/month, includes 10 million requests per month, then $0.30 per million additional requests. 30 seconds of CPU time.
- KV: Paid plan includes 10 million reads, 1 million writes, 1 GB of storage. Beyond that, $0.50 per million reads, $5 per million writes, $0.50 per GB-month.
- D1: Free tier available. Paid includes 5 million reads/day... actually D1 includes 5 billion rows read per month on the Paid plan. Keep the overview concise.
- No charge for egress on Workers (data transfer out is free) — a notable advantage.
Manageability: possible — wrangler CLI + Cloudflare API with an API token. Deploy, tail logs, manage KV/D1 all via CLI. Easy for an agent to manage, assuming a token with appropriate permissions. No local stack needed for deployment. Local development via wrangler dev exists, but can be skipped since there's dry-run and remote deployment.
Now let me build it. Since the sandbox may not have network access, I should first check whether network is available for npm install. Let me try it.
The repository is empty, and no Cloudflare credentials have been set. Cloudflare Workers has a developer workflow that can actually be executed (scaffolding + validation via wrangler CLI + deployment through the API), so I'll proceed with this. First, let me check network access:
cd /sandbox/repo && npm ping 2>&1 | tail -2
npm notice PING https://registry.npmjs.org/
npm notice PING https://registry.npmjs.org/ npm notice PONG 377ms
Recorded tool call
{
"type": "tool_call",
"seq": 9,
"ts": "2026-10-06T19:53:51.274Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && npm ping 2>&1 | tail -2",
"timeout": 30
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-9357eddc6a7dbb64",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 10,
"ts": "2026-10-06T19:53:51.757Z",
"turn": 1,
"output": {
"content": [
{
"text": "npm notice PING https://registry.npmjs.org/\nnpm notice PONG 377ms\n",
"type": "text"
}
]
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-9357eddc6a7dbb64",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The network is working. I'll create the project template.
Network works. Building a minimal Workers example:
File edits
1 file
Writtenpackage.jsonView changes
/sandbox/repo/package.json
Written content · previous contents were not recorded
{"name": "hello-cloudflare-worker","version": "0.1.0","private": true,"type": "module","scripts": {"check": "wrangler deploy --dry-run --outdir=dist","deploy": "wrangler deploy"},"devDependencies": {"wrangler": "^4"}}
Source: write · chatcmpl-tool-afe8ff785c065e2b
Recorded tool call
{
"type": "tool_call",
"seq": 14,
"ts": "2026-10-06T19:54:02.489Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/package.json",
"content": "{\n \"name\": \"hello-cloudflare-worker\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"check\": \"wrangler deploy --dry-run --outdir=dist\",\n \"deploy\": \"wrangler deploy\"\n },\n \"devDependencies\": {\n \"wrangler\": \"^4\"\n }\n}\n"
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-afe8ff785c065e2b",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 17,
"ts": "2026-10-06T19:54:02.489Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 258 bytes to /sandbox/repo/package.json",
"type": "text"
}
]
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-afe8ff785c065e2b",
"is_error": false,
"tool_kind": "file_edit"
}File edits
1 file
Writtenwrangler.jsoncView changes
/sandbox/repo/wrangler.jsonc
Written content · previous contents were not recorded
{"$schema": "node_modules/wrangler/config-schema.json","name": "hello-cloudflare-worker","main": "src/index.js","compatibility_date": "2025-06-01","observability": { "enabled": true }// Optional bindings you can add later (each needs one `wrangler` command to provision):// "kv_namespaces": [{ "binding": "CACHE", "id": "<namespace-id>" }],// "vars": { "GREETING": "Hello from Cloudflare Workers" },// "triggers": { "crons": ["*/10 * * * *"] }}
Source: write · chatcmpl-tool-8c51a68497247b69
Recorded tool call
{
"type": "tool_call",
"seq": 15,
"ts": "2026-10-06T19:54:02.489Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/wrangler.jsonc",
"content": "{\n \"$schema\": \"node_modules/wrangler/config-schema.json\",\n \"name\": \"hello-cloudflare-worker\",\n \"main\": \"src/index.js\",\n \"compatibility_date\": \"2025-06-01\",\n \"observability\": { \"enabled\": true }\n // Optional bindings you can add later (each needs one `wrangler` command to provision):\n // \"kv_namespaces\": [{ \"binding\": \"CACHE\", \"id\": \"<namespace-id>\" }],\n // \"vars\": { \"GREETING\": \"Hello from Cloudflare Workers\" },\n // \"triggers\": { \"crons\": [\"*/10 * * * *\"] }\n}\n"
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-8c51a68497247b69",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 18,
"ts": "2026-10-06T19:54:02.489Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 473 bytes to /sandbox/repo/wrangler.jsonc",
"type": "text"
}
]
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-8c51a68497247b69",
"is_error": false,
"tool_kind": "file_edit"
}File edits
1 file
Writtensrc/index.jsView changes
/sandbox/repo/src/index.js
Written content · previous contents were not recorded
/*** Simple Cloudflare Worker.* GET / -> JSON greeting* GET /echo?msg=hi -> echoes the message* GET /time -> current UTC time + colo info*/export default {async fetch(request, env, ctx) {const url = new URL(request.url);if (url.pathname === "/echo") {return json({ echo: url.searchParams.get("msg") ?? "" });}if (url.pathname === "/time") {return json({now: new Date().toISOString(),colo: request.cf?.colo ?? "unknown", // edge location that served the request});}return json({message: env.GREETING ?? "Hello from Cloudflare Workers",paths: ["/", "/echo?msg=hi", "/time"],});},};function json(obj) {return new Response(JSON.stringify(obj, null, 2), {headers: { "content-type": "application/json" },});}
Source: write · chatcmpl-tool-b24e5e2403dd8a1e
Recorded tool call
{
"type": "tool_call",
"seq": 16,
"ts": "2026-10-06T19:54:02.489Z",
"name": "write",
"turn": 1,
"input": {
"path": "/sandbox/repo/src/index.js",
"content": "/**\n * Simple Cloudflare Worker.\n * GET / -> JSON greeting\n * GET /echo?msg=hi -> echoes the message\n * GET /time -> current UTC time + colo info\n */\nexport default {\n async fetch(request, env, ctx) {\n const url = new URL(request.url);\n\n if (url.pathname === \"/echo\") {\n return json({ echo: url.searchParams.get(\"msg\") ?? \"\" });\n }\n\n if (url.pathname === \"/time\") {\n return json({\n now: new Date().toISOString(),\n colo: request.cf?.colo ?? \"unknown\", // edge location that served the request\n });\n }\n\n return json({\n message: env.GREETING ?? \"Hello from Cloudflare Workers\",\n paths: [\"/\", \"/echo?msg=hi\", \"/time\"],\n });\n },\n};\n\nfunction json(obj) {\n return new Response(JSON.stringify(obj, null, 2), {\n headers: { \"content-type\": \"application/json\" },\n });\n}\n"
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-b24e5e2403dd8a1e",
"tool_kind": "file_edit"
}Recorded tool result
{
"type": "tool_result",
"seq": 19,
"ts": "2026-10-06T19:54:02.489Z",
"turn": 1,
"output": {
"content": [
{
"text": "Successfully wrote 847 bytes to /sandbox/repo/src/index.js",
"type": "text"
}
]
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-b24e5e2403dd8a1e",
"is_error": false,
"tool_kind": "file_edit"
}›Thinking…
Alright, let's install wrangler and try running dry-run. Installation might take a little while, but it should be fine (since it's not a long-running service). Let's run it with a timeout set.
Next, install wrangler and verify the build with a dry run (no credentials needed, nothing will be deployed, no long-running processes either):
cd /sandbox/repo && npm install --no-audit --no-fund 2>&1 | tail -3
added 38 packages in 35s
added 38 packages in 35s
Recorded tool call
{
"type": "tool_call",
"seq": 22,
"ts": "2026-10-06T19:54:05.695Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && npm install --no-audit --no-fund 2>&1 | tail -3",
"timeout": 240
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-87bdccf26126bc8b",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 23,
"ts": "2026-10-06T19:54:41.497Z",
"turn": 1,
"output": {
"content": [
{
"text": "\nadded 38 packages in 35s\n",
"type": "text"
}
]
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-87bdccf26126bc8b",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Let's try running the dry-run check.
Now let me validate the Worker builds correctly with a dry-run (this doesn't deploy or hit the network):
cd /sandbox/repo && npx wrangler deploy --dry-run --outdir=dist 2>&1 | tail -25
⛅️ wrangler 4.148.0
⛅️ wrangler 4.148.0 ──────────────────── Total Upload: 0.92 KiB / gzip: 0.53 KiB No bindings found. --dry-run: exiting now. Cloudflare collects anonymous telemetry about your usage of Wrangler. Learn more at https://github.com/cloudflare/workers-sdk/tree/main/packages/wrangler/telemetry.md
Recorded tool call
{
"type": "tool_call",
"seq": 27,
"ts": "2026-10-06T19:54:43.120Z",
"name": "bash",
"turn": 1,
"input": {
"command": "cd /sandbox/repo && npx wrangler deploy --dry-run --outdir=dist 2>&1 | tail -25",
"timeout": 120
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-812365321a333f37",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 29,
"ts": "2026-10-06T19:54:52.593Z",
"turn": 1,
"output": {
"content": [
{
"text": "\n ⛅️ wrangler 4.148.0\n────────────────────\nTotal Upload: 0.92 KiB / gzip: 0.53 KiB\nNo bindings found.\n--dry-run: exiting now.\n\nCloudflare collects anonymous telemetry about your usage of Wrangler. Learn more at https://github.com/cloudflare/workers-sdk/tree/main/packages/wrangler/telemetry.md\n",
"type": "text"
}
]
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-812365321a333f37",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
The dry run was successful. The Worker builds without issues (0.92 KiB). Let me check whether the Cloudflare credentials are configured in order to know whether an actual deployment is possible.
I already checked env | grep -i cloudflare earlier, and there was nothing. Just to be safe, let me check the API token/account once more.
Confirmed that the build works fine (0.92 KiB). I'll check whether the credentials are available for the actual deployment step.
env | grep -i -E "CLOUDFLARE|CF_ACCOUNT|CF_API" | sed 's/=.*/=<set>/' ; echo "exit-scan-done"; ls ~/.wrangler 2>/dev/null; ls /sandbox/repo/.wrangler 2>/dev/null; echo "no-wrangler-config-dir"
exit-scan-done
exit-scan-done tmp no-wrangler-config-dir
Recorded tool call
{
"type": "tool_call",
"seq": 32,
"ts": "2026-10-06T19:54:56.759Z",
"name": "bash",
"turn": 1,
"input": {
"command": "env | grep -i -E \"CLOUDFLARE|CF_ACCOUNT|CF_API\" | sed 's/=.*/=<set>/' ; echo \"exit-scan-done\"; ls ~/.wrangler 2>/dev/null; ls /sandbox/repo/.wrangler 2>/dev/null; echo \"no-wrangler-config-dir\""
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-b23b77f09b728fbd",
"tool_kind": "shell"
}Recorded tool result
{
"type": "tool_result",
"seq": 33,
"ts": "2026-10-06T19:54:56.759Z",
"turn": 1,
"output": {
"content": [
{
"text": "exit-scan-done\ntmp\nno-wrangler-config-dir\n",
"type": "text"
}
]
},
"run_id": "cmux3j8yq005m0iwp82uiyt3s",
"tool_id": "chatcmpl-tool-b23b77f09b728fbd",
"is_error": false,
"tool_kind": "shell"
}›Thinking…
Cloudflare API credentials are not configured. Therefore, actual deployment cannot be performed — because CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID do not exist. This is the blocker. What the user asked me to do is:
- Build a simple example using Cloudflare ✓ (done, verified with dry-run)
- Explain how pricing works
- Briefly tell them whether it's easy to manage
- Let them know if I hit a blocker
The blocker is the actual deployment, since API credentials are required. However, the build/verification part is done. Let me report clearly.
The example is built and verified. The part that's blocked is actual deployment (which requires an API token). That's fine — deploying to a hosted product requires credentials. Let me clearly report this point.
Let me not overdo it. The task said "use hosted products via their SDK or API." I built the example, verified it compiles, and identified the blocker for live deployment (no credentials). This is the correct stopping point.
Alright, let me write the summary now.
Done. The example builds and validates cleanly. Here's the summary.
What I built
A minimal Cloudflare Worker in /sandbox/repo:
src/index.js— the Worker code:GET /(greeting),/echo?msg=hi,/time(also reports which edge colo served it)wrangler.jsonc— config (name, entrypoint, observability), with commented-out examples for KV/vars/cron triggerspackage.json—npm run check(dry-run build) andnpm run deploy
I installed wrangler and ran a dry-run build: it compiles fine (0.92 KiB / 0.53 KiB gzipped). No local service stack, nothing long-running.
Where I'm blocked
I can't do the actual deploy. There are no Cloudflare credentials in this environment (CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID are unset), so wrangler deploy can't authenticate to your account. If you provide an API token (with Workers:Edit scope) and account ID, I can run the live deploy and hit the URL to verify.
How pricing works (Workers)
- Free tier: 100,000 requests/day, 10ms CPU per request. Genuinely enough to run this example at low traffic for $0.
- Paid: $5/month base, which includes 10M requests/month and 30M CPU-seconds. Beyond that, ~$0.30 per million requests and ~$0.02 per million CPU-seconds.
- Billed on execution, not uptime — you pay for CPU time actually used while handling requests, not for an idle server sitting around. Bindings (KV, D1, R2, Queues) have their own usage-based rates with free allowances.
Easy for me to manage?
Yes, very. The whole workflow is a single CLI (wrangler) — deploy, tail (live logs), kv, d1, secret — plus a plain wrangler.jsonc config that's easy to read and diff. Everything is code/config in the repo, and the build is verifiable offline via --dry-run, so I can safely iterate without touching production. The only thing gating hands-on management is account credentials.
AX Fundamentals
23 checks. Open an area for details.
This check is a quick preview. Test more tasks and models with Gauge Agents.
Test your product with Gauge Agents