The player can submit an intentional verification request.
TRUSTBADGE / DOCUMENTATION
World integration
without guesswork.
Reference material for world owners and developers using the official TrustBadge package.
Verification flow
A player starts verification from the in-world panel. The package creates an authenticated request containing the display name, world tag, timestamp, and a one-time nonce. The API resolves the name to a permanent VRChat user ID, reads the account-level 18+ status, stores the limited result, and returns an access state.
- Player consentThe panel explains the fields used before a request is sent.
- Authenticated lookupThe official package signs an encrypted request that expires quickly.
- Permanent matchingThe server associates the result with the VRChat user ID, not a copied display name.
- Reusable accessParticipating worlds can recheck the same account after join.
World installation
- Request accessJoin the official Discord and open a world-owner ticket.
- Import the packageUse the supported Unity and VRChat SDK versions listed with your package release.
- Place the prefabAdd the official TrustBadge prefab and configure restricted trigger zones.
- Set the world tagUse a short stable identifier for logs, rate limits, and the optional webhook.
- Test every stateVerify success, denial, loading, maintenance, timeout, and recheck behavior before publishing.
Expected UI states
The permanent account ID has an eligible stored result.
VRChat did not return an eligible account status.
The global service switch is active. Access controls should fail safely.
The request timed out or the API could not be reached.
The world should wait for the supplied retry interval.
Public status API
The status route is unauthenticated and low sensitivity. Worlds poll it for maintenance state and the verified count.
https://api.trustbadge.dev/api/v1/status{
"status": "ok",
"maintenance": false,
"verified_count": 1284
}The website also exposes /api-status. That Cloudflare Pages Function probes the API independently with a four-second timeout, so it can report an outage while the backend is unreachable.
World API
The official prefab uses two protected GET routes because VRChat's string downloader supports GET requests. Integrators should not construct these envelopes by hand.
/api/v1/verify?kid=&n=&d=&m=Intentional player verification/api/v1/check?kid=&n=&d=&m=Join-time account recheckkid selects the issued product key. n is a one-time nonce. d is the encrypted payload. m authenticates the request. Invalid, expired, replayed, or rate-limited requests are rejected.
Security model
- Client display names are never accepted as durable identity.
- Each protected request has authenticated data, a timestamp window, and replay protection.
- Rate limits apply by source and world tag.
- Product keys stay outside public repositories and world documentation.
- Administrative mutations require a Discord-authorized session and an additional request header.
- Maintenance state propagates without a world redeploy.
Data boundary
TrustBadge stores the permanent VRChat user ID, current display name, verification status, and check timestamps. Operational logs can include event type, world tag, result, and limited technical detail. TrustBadge does not receive identity documents, date of birth, legal name, password, or VRChat email address.
Read the complete privacy policy →Support and data requests
Join the official Discord and open a private ticket for package access, integration help, incident reports, account appeals, or record removal. Do not post account IDs, keys, webhook URLs, or private details in public channels.
Open TrustBadge Discord →