Since no one from the Directus team has responded, we went ahead and answered our own questions by reading the v12 RC1 source code directly. I’m sharing the findings here because we suspect many community members — especially self-hosters and agencies — may not be fully aware of the implications. All file paths refer to the public repository at tag v12.0.0-rc.1; one finding comes from the published npm package @directus/license@0.2.0, which is the exact version pinned in the repo’s pnpm-workspace.yaml.
What Is Actually Being Transmitted
Every 6 hours (and once on startup), Directus sends a POST request to https://telemetry.directus.io/v1/metrics containing:
| Field |
Value |
url |
Your configured PUBLIC_URL (your production domain) |
project_id |
Unique installation identifier |
version |
Directus version |
database |
Database type |
admin_users |
Admin user count |
app_users |
App user count |
api_users |
API user count |
roles |
Role count |
flows |
Active flow count |
dashboards |
Dashboard count |
collections |
User collection count |
items |
Total item count across all user collections |
fields_total / fields_max |
Field counts |
files |
File count |
database_size |
Database size in bytes |
files_size_total |
Total upload size in bytes |
extensions |
Enabled extension count |
mcp_enabled / mcp_allow_deletes / mcp_system_prompt_enabled |
MCP configuration booleans |
websockets_enabled |
Boolean |
collaborative_editing_enabled |
Boolean |
ai_openai_api_key |
Boolean (whether a key is configured) |
ai_anthropic_api_key |
Boolean (whether a key is configured) |
ai_system_prompt |
Boolean (whether a custom prompt is configured) |
api_requests_get/post/patch/delete/put/search |
Per-method API request counts |
api_requests_cached |
Cached request count |
api_requests |
Total request count |
There is a second data stream — POST https://telemetry.directus.io/v1/owner — which transmits project_owner, org_name, and contact email for license compliance. This is not optional and not governed by the TELEMETRY flag.
2. TELEMETRY=false no longer works in v12 — for anyone
In v11, the opt-out is a plain env check (api/src/schedules/telemetry.ts):
if (toBoolean(env['TELEMETRY']) === false) return false;
In v12.0.0-rc.1 the same file reads:
if (!getEntitlementManager().isEntitled('telemetry_required') && !toBoolean(env['TELEMETRY'])) {
return false;
}
isEntitled() returns override ?? default of the active license’s entitlements. And the built-in Core license — which applies to every installation without a license key — ships with (from @directus/license@0.2.0, CORE_LICENSE):
telemetry_required: { default: true }
Putting these together: in v12, the TELEMETRY=false environment variable is ineffective on every tier, including keyless Core installations, unless the active license overrides telemetry_required. This is consistent with the pricing page, which lists “Analytics Opt-out” exclusively under Enterprise. It directly contradicts the current configuration docs, which still describe TELEMETRY as a freely settable variable for self-hosted projects.
3. License validation includes remote enforcement
Source: api/src/license/manager.ts, api/src/schedules/license.ts, Licensing Overview docs
With a license key active (paid tiers and Open Innovation Grant — grant users receive registration keys too):
- The instance periodically calls the license server, transmitting
usage_metrics (seats, collections, flows), project_id, and public_url.
- The check interval (
validation_interval) is embedded in the license token, i.e. controlled server-side.
- If the server responds
LICENSE_EXPIRED, LICENSE_CANCELED, or LICENSE_SUSPENDED, the instance removes its license and downgrades to Core entitlements across all containers.
- Per the official docs, an instance over its entitlements outside a grace period becomes “locked”:
/items and common API operations are blocked, GraphQL/WebSockets/MCP are disabled, non-admin logins are rejected.
I’ll state my assessment plainly, and everyone can judge for themselves: a system that periodically reports usage to a vendor server and accepts remote suspension decisions that render the API non-functional can, in my view, reasonably be described as license DRM with a built-in kill switch. The mechanism applies to every keyed installation — and since Core’s limits (3 seats / 25 collections / 5 flows) are below virtually any production workload, practically every production deployment will be keyed. The OIG terms explicitly reserve the right to revoke grant keys.
4. Owner registration
Source: api/src/schedules/project.ts, api/src/telemetry/lib/send-report.ts
While project_status is pending, a daily job sends project_owner, org_name, project_usage, product_updates, and project_id to COMPLIANCE_URL (default: the same telemetry server, /v1/owner), then clears the status. This transmission includes directly person-related data (owner name, contact email) and is governed neither by TELEMETRY nor by any documented opt-out I could find.
5. GDPR concerns for EU self-hosters
This is where it gets legally uncomfortable for those of us hosting for European clients.
What is being transmitted and where: Identifiable installation data (PUBLIC_URL + project_id), owner contact data, and business metrics are sent to Monospace Inc., a Delaware-incorporated US company.
What I could not find:
- A publicly available Data Processing Agreement (DPA) covering self-hosted deployments. The Trust Center (trust.directus.io) gates its documents behind an access request. The DPA referenced publicly appears to cover Directus Enterprise Cloud only.
- Monospace Inc. in the EU-US Data Privacy Framework participant registry.
- Standard Contractual Clauses (SCCs) or any other Art. 46 GDPR transfer mechanism documented for self-hosters.
If any of these exist, a public pointer would resolve this section immediately — I’d genuinely welcome being corrected here.
The MSCL license compounds the problem: Its anti-circumvention clause prohibits disabling or circumventing the license key functionality. Since telemetry enforcement in v12 is implemented as part of the license entitlement system (telemetry_required), an EU operator who needs to stop these transfers to remain compliant with their own client obligations arguably cannot do so without either violating the license terms or staying on v11.
If you are an EU-based agency or developer hosting Directus instances on behalf of clients under data processing agreements, this is not a theoretical concern. Your PUBLIC_URL — which identifies your client’s infrastructure — is transmitted to a US company on a legal basis I have not been able to determine from public materials.
6. Open questions
- Is the v12 behavior of ignoring
TELEMETRY=false on non-Enterprise tiers (including keyless Core) intended? If yes, please update the configuration docs accordingly.
- Does “Analytics Opt-out” on the pricing page refer to the
telemetry_required entitlement override, or to something else? The term “Analytics” appears nowhere in code or docs.
- Is there a DPA and an Art. 46 GDPR transfer mechanism for self-hosted deployments? (See section 5.)
- What is the reference date for the MSCL’s 4-year GPL conversion? “The date we make the Software available” is ambiguous as to whether it refers to each version’s release.
I’d appreciate answers from the team — these are questions any EU-based agency must be able to answer before deploying v12 for clients.
Thank you for your effort @alphanull, now I'm also waiting for the answers from the team, but with what we know by now, I'm not very optimistic.
– easyviber