Cloudflare Pages (Direct Upload / Wrangler)
- Free allowance
- 20,000 files per site on Free; 25 MiB max per file; 100 projects per account => ~488 GiB per project, ~48.8 TiB per account.
- Verdict
- ★ qualifiesusable as stated; the read path was probed
- Cost
- free tier
- Identity
- email?placeholder, not evidence; card unknown, phone unknown
- Binding limit
- per-object-cap25 MiB max per file
- Evidence
- documented7 sources; a first-party page was read and the sentence quoted
- Freshness
- stale on 2026-11-21checked 2026-10-21 (inherited); stale on 2026-11-21
| Free tier | 20,000 files per site on Free; 25 MiB max per file; 100 projects per account => ~488 GiB per project, ~48.8 TiB per account. No stated total-bytes cap. unit objects; metered on unstated |
|---|---|
| Price | none stated |
| Limits |
25 MiB hard per file (no override on Free); 20,000 files per site on Free; 500 builds/month and 20-min build timeout if Git-driven; new-project creation throttled for the first 48h of a new account ('Cloudflare limits the number of new Pages projects you can create within your first 48 hours'); Functions requests draw from the 100k/day Workers quota, but pure static requests do not. |
| Binding | per-object-cap the per-object cap sets the shard size and therefore the object count; it bounds the total more tightly than any headline quota |
| Identity | email (placeholder) not published |
| Egress | Unlimited requests and unlimited bandwidth: 'Static asset requests ... are free and unlimited' (pages/functions/pricing) and 'Unlimited bandwidth ... no extra cost to you' (blog.cloudflare.com/big-ideas-on-pages). |
| Per-object cap | 25 MiB max per file (26214400 bytes) |
| Retention | not stated |
| Interface | rest, git, rclone, cli rest |
| Tooling | wrangler pages deploy (official CLI, direct upload of a folder, no Git required); Cloudflare API v4 /accounts/:id/pages/projects/:name/deployments does multipart upload; rclone has no native 'pages' backend but can be driven via 'rclone serve http' + wrangler or a custom remote. |
| Composes with | 100 projects per account (docs: 'limit of 100 projects per account. This limit is not routinely increased') x 20,000 files x 25 MiB. Unlimited free Cloudflare accounts x 100 projects. Workers Static Assets (100 Workers free, 20,000 files each) is a second, independent pool on the same account. Sharding is by file: any 10 TiB working set = ~420k shards of 25 MiB spread over ~21 projects. |
| Reliability | Assets stay cached on the CDN until the next deployment, so re-upload churn is the only real risk; no data-vanishing mechanism observed, and static serving is not rate-limited or billed. |
| Evidence note | documented The page states the number in the record; The page states the number in the record; the claim is documented, not measured. |
| Parsed numbers |
|
Evidence 7
| date | source | what it proved |
|---|---|---|
| 2026-10-22 | developers.cloudflare.com/pages/platform/limits/ | Pages Free plan allows 20,000 files per site, 25 MiB per file. Re-read https://developers.cloudflare.com/pages/platform/limits/: HTTP 200, 7360 bytes, sha256 77e09b369ce18a37. Quoted: ch file on your site to Cloudflare's globally distributed network to deliver a low latency experience to every user that visits your site. Cloudflare Pages sites can contain up to 20,000 files on the Free plan. Paid plans (such as Pro, Business, and Enterprise plans) can have up to 100,000 files per site. To enable this increased limit, set the environment variable PAGES_WRANGLER_MAJOR_VERSION=4 in your Pages project settings. ## File size The |
| 2026-10-22 | developers.cloudflare.com/pages/functions/pricing/ | requests to static assets are free and unlimited on Free and paid plans. Re-read https://developers.cloudflare.com/pages/functions/pricing/: HTTP 200, 3777 bytes, sha256 c163cd6d9d46f7fd. Quoted: [change usage models](https://developers.cloudflare.com/workers/platform/pricing/#how-to-switch-usage-models). ### Static asset requests On both free and paid plans, requests to static assets are free and unlimited. A request is considered static when it does not invoke Functions. Refer to [Functions invocation routes](https://developers.cloudflare.com/pages/functions/routing/#functions-invocation-routes) to learn more about when Functions are invoked. ## Free Plan… |
| 2026-10-21 | developers.cloudflare.com/pages/platform/limits/ | 'Cloudflare Pages sites can contain up to 20,000 files on the Free plan', 'maximum file size for a single Cloudflare Pages site asset is 25 MiB', 'limit of 100 projects per account' (page last updated Sep 5, 2026) |
| 2026-10-21 | developers.cloudflare.com/pages/functions/pricing/ | 'On both free and paid plans, requests to static assets are free and unlimited' |
| 2026-10-21 | blog.cloudflare.com/big-ideas-on-pages/ | 'Unlimited requests ... Unlimited bandwidth ... for free' |
| 2026-10-21 | vite.pages.dev/ | probe: curl -D - -> HTTP/1.1 200, Server: cloudflare, x-server: Cloudflare Pages |
| 2026-10-21 | vite.pages.dev/assets/index.37d2ad0a.js | probe: curl -D - -> 200, Content-Type: application/javascript, Content-Length: 1555, Cache-Control: public, max-age=0, must-revalidate (direct binary asset served off pages.dev) |
More fields 1
{
"verified": [
{
"url": "https://developers.cloudflare.com/pages/functions/pricing/",
"date": "2026-10-22",
"via": null,
"http_status": 200,
"bytes": 3777,
"sha256": "c163cd6d9d46f7fd46095c5a8ce78102090d9cb7a37c9e9b215f35f8e7615727",
"pattern_found": true,
"what_changed": "no change: the page still states the claim",
"capture": "captures\\cloudflare-pages-developers-cloudflare-com-pages-functions-pricing-.txt"
},
{
"url": "https://developers.cloudflare.com/pages/platform/limits/",
"date": "2026-10-22",
"via": null,
"http_status": 200,
"bytes": 7360,
"sha256": "77e09b369ce18a373420038b357e2d023518e2c8875292ac8291036c5f68dd2a",
"pattern_found": true,
"what_changed": "no change: the page still states the claim",
"capture": "captures\\cloudflare-pages-developers-cloudflare-com-pages-platform-limits-.txt"
}
]
}Unknown values 3
$.per_object_cap.notesthe field may be stated in a source that was not read$.retention.notesthe field may be stated in a source that was not read$.retention.statedthe field may be stated in a source that was not read