Hi everyone!
I’m developing a VRChat world containing multiple mini-games, and I’d like to collect some basic, anonymous gameplay statistics, such as how many times each mini-game has been started across all world instances.
However, after reading the VRChat SDK License, particularly Sections 4.1 and 4.2, I’m unsure whether this implementation would be permitted.
My Proposed Implementation
The implementation is fairly simple:
-
When a mini-game starts, UdonSharp uses
VRCStringDownloaderto make an HTTP GET request to a predefined, fixed URL hosted on Cloudflare Workers. -
The Cloudflare Worker increments a counter in a database for that specific mini-game.
-
The request URL is completely static, with no dynamically generated parameters.
-
No player IDs, usernames, scores, or other player-specific information are intentionally included in the request.
For example:
Mini-game starts
↓
VRCStringDownloader
↓
GET https://example.com/api/game-a-start
↓
Cloudflare Worker
↓
Game A total starts += 1
The purpose is simply to collect aggregate gameplay statistics for world development and balancing, not to track individual players.
My Questions About Section 4.2
Section 4.2 states:
Licensee will not use any internet connected component to send dynamic data from the VRChat Platform to another server, except through VRChat-provided dynamic components.
It also states that internet-connected components may only be used to display remotely downloaded content.
This seems to create two separate restrictions, and I’m particularly interested in understanding how they apply to the following scenarios.
Scenario A: Using a Fixed GET Request Solely for Counting
When a mini-game starts, the world requests a fixed URL, and the server increments its counter.
Nothing is displayed to players.
Based on the first part of Section 4.2, I understand that this may already conflict with the restriction limiting internet-connected components to displaying downloaded content.
Scenario B: Displaying the Updated Counter in the World
What if the Cloudflare Worker also returns the updated total number of game starts, and the world actually displays that information to players?
For example:
Mini-game starts
↓
GET (fixed URL)
↓
Cloudflare Worker
├─ Increment counter
└─ Return updated total
↓
Display in world:
"Total games played: 12,345"
In this case, the downloaded content would genuinely be displayed in the world.
However, the request would still be triggered by an in-world gameplay event.
Would this implementation satisfy the content-display restriction, or would the server-side counting functionality still make it prohibited?
The Main Question: What Constitutes “Dynamic Data”?
The URL itself never changes, and no dynamically generated game data is included in the request parameters.
However, the timing of the request effectively communicates that a mini-game has started.
This leads to my main question:
Does triggering a completely fixed HTTP GET request in response to an in-world event constitute sending “dynamic data” under Section 4.2, even when the URL and request parameters remain unchanged?
And would displaying the server’s response in the world affect how this restriction applies?
What About Section 4.1?
Section 4.1 also restricts sending data collected from users, including usage data, to external servers.
My intention is only to record aggregate game-start counts, without associating them with individual players.
Would these anonymous, aggregate event counts still fall under the definition of user data or usage data?
Response from VRChat Support
I previously contacted VRChat Support to ask for clarification.
Unfortunately, I was informed that they do not provide individual clarifications on the Terms of Service, Community Guidelines, or other documents, although feedback may be considered for future policy updates.
As a result, I still don’t have an official answer regarding this specific implementation.
I’d Appreciate Your Thoughts
I’m interested in hearing how other world creators interpret these restrictions.
-
Has anyone implemented something similar or encountered relevant official public guidance?
-
Do you think triggering a fixed-URL request based on an in-world event constitutes transmitting dynamic data?
-
Would displaying the returned data make a meaningful difference under Section 4.2?
-
If neither approach is permitted, are there any officially supported alternatives for collecting custom aggregate gameplay statistics across world instances?
I understand that community opinions are not official policy interpretations. I’m simply hoping to better understand the restrictions.
I want to make sure my world complies with the SDK License.
English isn’t my first language, so I used ChatGPT to help translate and polish this post. I apologize if there are any mistakes or unclear expressions. Please feel free to ask if anything needs clarification!
Thanks in advance for any insights!
