Guides · Concepts
Projects
What a project is, what its card says, and the few rules that govern its life.
The card#
GET /v1/projects/:pid (the get_project tool) returns:
id—proj_followed by a ULID. Every host of the project derives from it.name— free-form, changeable any time without confirmation.plan— the account's plan,freeorpersonal(the Builder plan); it sets the seat cap of the app (3 on Free, 1 000 on Builder).region—weur, Cloudflare's Western Europe region. Fixed at creation.app_url— the public address of the app, ornull. See below.seats—{ used, cap, as_of }.usedcounts people who signed in at least once;as_ofdates the reading it comes from (see below).status—provisioning,activeorsuspended.created_at,tables(a count),urls.api— the host of the project's data plane — andurls.site, the address of its site.
Status#
- provisioning — the database and bucket are being created, about six seconds. Export and delete answer
409meanwhile. - active — nominal.
- suspended — the account is above one of its volume quotas (file storage, database size, requests of the month). Reads keep serving; writes on the data plane answer
402 quota_exceeded; management keeps working, and deleting a project is always allowed — it is the way out. The status is set and lifted by an hourly job, never by a request; freeing space is noticed at the platform's next reading, within minutes, and the status follows at the next hourly check. See Limits and quotas.
The app URL#
app_url is where the app lives. Two things depend on it today: invitation links are built from it (an app without one cannot invite), and it is what the first site deployment fills in when it is empty.
A value you choose enters only through a signed-in human and a two-step confirmation, because changing it redirects every user of the app. Deploying a site fills the value in when there is none — with the site's own readable address, which always designates the site we serve for that project and never anyone else's origin — and never replaces a value that exists. Taking a site down clears the app URL only if it still pointed at that site. The value is https:// only, in canonical form with its trailing slash: https://my-app.example/.
Figures are dated readings#
No route measures. The card, the project list and the usage route all return the platform's last reading of the project, with its as_of. The platform refreshes that reading on its own, every five minutes, a few projects at a time, whether or not anyone is looking — and a new project starts with zeros, which are true. A project never observed returns null for these figures, with a hint saying so — never a 0.
The app limit#
The Free plan holds 2 projects, Builder 20 and Studio 100. The limit counts existing projects: deleting one frees its slot at once. Beyond it, creating answers 402 quota_exceeded with the two exits — delete an app, or upgrade. An account that comes back to Free keeps its projects; those beyond the limit, in creation order, become read-only until the account is back under.
Deleting a project#
Deleting takes the database and its tables, the rows, the end users, the spaces, the files, the keys, the edge functions and their secrets, the site, and the GitHub link. It requires a signed-in human and confirms in two steps; nothing is destroyed until the confirmation. The account's app slot is freed. What survives is the account's audit journal — see Retention.
