Cloudflare’s own pricing and limits pages are the authority. When this page and Cloudflare disagree, Cloudflare is right. What is here is how the capability’s routes map onto those meters.
Workers Paid only
Cloudflare Artifacts runs on the Workers Paid plan and nowhere else. On a Free plan the binding composes, the Worker deploys, and the first create is refused at runtime, in production. Check the plan before you ship.
Billing begins 14 October 2026
Cloudflare bills Artifacts on two dimensions, each past a monthly allowance.
| Dimension | Included | Then |
|---|---|---|
| Operations | 10,000 a month | $0.15 per 1,000 |
| Storage | 1 GB-month | $0.50 per GB-month |
Source: Artifacts · Pricing.
What each route costs
Cloudflare counts repository operations “such as create, push, pull, and clone”. It does not publish a complete list. So estimate from what each route calls, and treat the calls it does not name as possible operations.
| Route | Calls into Cloudflare |
|---|---|
GET /artifacts/repos, GET /artifacts/organization/repos | None. D1 only |
| Set or remove a grant | None. D1 only |
| Read a repository | Two: open it, then its info |
| Mint a token | Three: open, the token, and the repository’s remote |
| Create a repository | Four: the repository, then open it, revoke the token Cloudflare made with it, and list its tokens to record that one |
GET /artifacts/admin/repos | Two for each repository on the page: open, then its info |
GET /artifacts/admin/repos/:name | Three: open, its info, and its log |
GET /artifacts/admin/repos/:name/tokens | Two: open, and the list |
| Revoke one token | Two: open, and the revoke. Three when the revoke takes nothing back and the kit holds no record of the token, because the list is read |
| Revoke every token, by a management client or the owner’s break-glass | Open, one revoke for each unexpired token the kit recorded, then a list and a revoke for each live token it still shows, until a list shows none live |
| A replayed revocation | None |
| Every other route | One to open the repository, then its own |
Revoking every token starts from the kit’s records, because the list is one page with no cursor. Revoking by record reaches every token the kit minted, whatever the list shows. The list then catches a live token the kit did not mint, made on the binding by your own code or over Cloudflare’s REST API. The binding’s list answers 30 tokens a page, newest first, active tokens only: a revoked token leaves the list, so each round reaches the next page, until a list shows none live or a round revokes none. A live suite records that page size and order against a real namespace, mints more live tokens than one page holds, revokes them on the list alone, and fails if git still accepts any of them; the integration suites are required before a release. With every recorded token revoked and nothing else live, a revoke-all is open, one call per recorded token and one list. Revoking one token: a dead token the kit minted answers revoked: 0 from its record without the list, and a dead token it did not mint answers 404, like one that does not exist.
Each git clone, fetch or push is Cloudflare’s own operation. A git client mints once for each one it runs. That is by design: a busy repository costs operations rather than standing credentials.
Limits
| Limit | Value |
|---|---|
| Storage per repository | 1 GB |
| Storage per account | 1 TB, raised on request |
| Largest file or blob | 32 MB |
| Control-plane requests | 2,000 per 10 seconds, per namespace |
| Git requests | 2,000 per 10 seconds, per repository |
| Namespace name | 2 to 63 characters |
| Repository name | A letter or digit, then letters, digits, ., _ and -. Pithy holds it to 63 characters |
Source: Artifacts · Limits.
The kit does not meter a customer’s storage against either cap. GET /artifacts/repos/:name reports what Cloudflare holds. What to do about a large repository is your decision.
One namespace per environment
Each environment has its own namespace, <project>-<env>. So production’s rate limit is production’s alone.
A feature’s is <project>-f<issue>-<slug>--artifacts. pithy feature destroy deletes every repository in it, because a repository nobody deletes counts against the account’s terabyte forever. Then it deletes the namespace.