From 211ff6b15545798a4646d7537d207aa77bbe60f6 Mon Sep 17 00:00:00 2001 From: James White Date: Fri, 7 Aug 2026 10:10:37 +0100 Subject: [PATCH 1/2] add key definitions for seats and collections --- content/guides/03.auth/2.access-control.md | 4 ++- content/licensing/1.overview.md | 42 ++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) diff --git a/content/guides/03.auth/2.access-control.md b/content/guides/03.auth/2.access-control.md index 28335a48..fcb79297 100644 --- a/content/guides/03.auth/2.access-control.md +++ b/content/guides/03.auth/2.access-control.md @@ -117,11 +117,13 @@ Specifying both the IPv4 and IPv6 addresses ensures uninterrupted access to your ## Studio Users -Studio Users in Directus are used in the context of licensing and billing for Directus Cloud. A studio user meets at least one of the following criteria: +Studio Users are the users counted against the seat limit on your plan, whether you are self-hosted or on Directus Cloud. A Studio user meets at least one of the following criteria: 1. At least one policy with 'Admin Access' enabled. 2. At least one policy with 'App Access' enabled, allowing access to the Data Studio. +Users who have neither are API-only users and do not consume a seat, however many of them you have. See [Key Definitions](/licensing/overview#key-definitions) in the licensing overview for the full seat and collection counting rules. + ## Combining Multiple Policies When multiple policies are assigned to a role or user, the system evaluates and combines these policies depending on the type of restriction or permission being applied. Understanding how these rules combine is essential for designing effective access control strategies. diff --git a/content/licensing/1.overview.md b/content/licensing/1.overview.md index 0fcabada..b36a31ed 100644 --- a/content/licensing/1.overview.md +++ b/content/licensing/1.overview.md @@ -13,9 +13,51 @@ Free commercial use is available through the **[Open Innovation Grant](https://d Quick links: +- [What counts as a user seat or a collection?](#key-definitions) - [Enquire about a commercial license](https://directus.com/contact) - [Upgrading to Directus 12 (existing customer)](#upgrading-to-directus-12) +## Key Definitions + +Plan limits are counted in units that are easy to misread. This section defines what counts toward **user seats** and **collections**. For the limits that apply to each tier, see the [pricing page](https://directus.com/pricing). + +### User Seats + +A seat is consumed by each **active Studio user**: a user who can access the Data Studio. A user is a Studio user if they have at least one policy with **App Access** or **Admin Access** enabled. See [Studio Users](/guides/auth/access-control#studio-users) for the full criteria. + +**API-only users do not count toward your seat limit.** These are users created and managed in Directus who never access the Data Studio and reach your data only through the REST, GraphQL, WebSockets, or SDK APIs. Common examples: + +- End users of your application, whether they register themselves through your frontend or you create their accounts for them. +- Service accounts and integrations that authenticate with a static token. + +None of these consume a seat, however many of them you have, provided no policy grants them app access. Conversely, a user whose policy grants app access counts whether or not they ever log in. + +::callout{icon="i-lucide-info"} +**Seats measure Studio access, not the size of your user base.** +
+A project with 2 content editors and 50,000 registered application users consumes 2 seats. Only accounts that can open the Data Studio are counted. +:: + +Invitations are not blocked when you are at your seat limit, but **activation** of a user beyond the limit is. To activate a pending user, either increase your seat count or free a seat by removing app access from an existing user. + +### Collections + +A collection counts toward your limit if it is a user collection registered in Directus, meaning it has Directus metadata and appears in the Data Studio. See [Collections](/guides/data-model/collections) for the difference between user and system collections. + +Counted: + +- User collections, whether created through the Data Studio, the API, or created in your database and then registered in Directus. +- Translation collections, such as `articles_translations`. +- Junction tables created for many-to-many and many-to-any relationships. + +Not counted: + +- System collections, which are prefixed with `directus_`. +- Folders, which group collections in the Data Model settings and are not tables. +- Database-only tables, meaning tables that exist in your database but have no Directus metadata because they were never registered in Directus. + +Translation collections and junction tables receive no special treatment: they are standard user-created tables, so each one counts as a collection. Account for them when you estimate your total. + ## `PUBLIC_URL` and Licensing Before applying a license, `PUBLIC_URL` must be set to a valid absolute URL (e.g. `https://directus.example.com`). The default value (`/`) and any relative path are rejected by the licensing service during [activation](#activations-and-project-bindings). From 23e01d5404123cd5f056a8cf7aaa353b14d7fa17 Mon Sep 17 00:00:00 2001 From: James White Date: Fri, 7 Aug 2026 16:01:35 +0100 Subject: [PATCH 2/2] Apply suggestions from code review Co-authored-by: judda <44623501+ComfortablyCoding@users.noreply.github.com> --- content/guides/03.auth/2.access-control.md | 2 +- content/licensing/1.overview.md | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/content/guides/03.auth/2.access-control.md b/content/guides/03.auth/2.access-control.md index fcb79297..e61d53e6 100644 --- a/content/guides/03.auth/2.access-control.md +++ b/content/guides/03.auth/2.access-control.md @@ -122,7 +122,7 @@ Studio Users are the users counted against the seat limit on your plan, whether 1. At least one policy with 'Admin Access' enabled. 2. At least one policy with 'App Access' enabled, allowing access to the Data Studio. -Users who have neither are API-only users and do not consume a seat, however many of them you have. See [Key Definitions](/licensing/overview#key-definitions) in the licensing overview for the full seat and collection counting rules. +Users with neither are considered API-only users and do not consume a seat, regardless of how many of them may exist. See [Key Definitions](/licensing/overview#key-definitions) in the licensing overview for the full seat and collection counting rules. ## Combining Multiple Policies diff --git a/content/licensing/1.overview.md b/content/licensing/1.overview.md index b36a31ed..69e011be 100644 --- a/content/licensing/1.overview.md +++ b/content/licensing/1.overview.md @@ -23,22 +23,22 @@ Plan limits are counted in units that are easy to misread. This section defines ### User Seats -A seat is consumed by each **active Studio user**: a user who can access the Data Studio. A user is a Studio user if they have at least one policy with **App Access** or **Admin Access** enabled. See [Studio Users](/guides/auth/access-control#studio-users) for the full criteria. +A seat is consumed by each **active Studio user**. A user is a Studio user if they have at least one policy with **App Access** or **Admin Access** enabled. See [Studio Users](/guides/auth/access-control#studio-users) for the full criteria. **API-only users do not count toward your seat limit.** These are users created and managed in Directus who never access the Data Studio and reach your data only through the REST, GraphQL, WebSockets, or SDK APIs. Common examples: - End users of your application, whether they register themselves through your frontend or you create their accounts for them. - Service accounts and integrations that authenticate with a static token. -None of these consume a seat, however many of them you have, provided no policy grants them app access. Conversely, a user whose policy grants app access counts whether or not they ever log in. +These users do not consume a seat, regardless of how many exist, provided no policy grants them app access. Conversely, any user whose policy grants app access consumes a seat, whether or not they ever log in. ::callout{icon="i-lucide-info"} **Seats measure Studio access, not the size of your user base.**
-A project with 2 content editors and 50,000 registered application users consumes 2 seats. Only accounts that can open the Data Studio are counted. +A project with 2 content editors and 50,000 registered application users consumes 2 seats. Only accounts that can access the Data Studio are counted. :: -Invitations are not blocked when you are at your seat limit, but **activation** of a user beyond the limit is. To activate a pending user, either increase your seat count or free a seat by removing app access from an existing user. +You can send invitations even after reaching your seat limit. However, you cannot **activate** a user beyond the limit. To activate a pending user, either increase your seat count or free a seat by removing app access from an existing user. ### Collections @@ -54,7 +54,7 @@ Not counted: - System collections, which are prefixed with `directus_`. - Folders, which group collections in the Data Model settings and are not tables. -- Database-only tables, meaning tables that exist in your database but have no Directus metadata because they were never registered in Directus. +- Database-only tables, which exist in your database but have no associated Directus metadata because they are not registered in Directus. Translation collections and junction tables receive no special treatment: they are standard user-created tables, so each one counts as a collection. Account for them when you estimate your total.