Suspicion Scoring
How the self-hosted integrity server scores a player: one running number per player that rises when checks fail and falls when they pass, with three action thresholds — warn, escalate, kick. The exact point values, thresholds and intervals are fixed defaults in the server source you host, where you can read and tune them for your title.
Spot-Check Mechanism
The integrity server does not see every operation. Instead it periodically performs spot-checks: it picks a few of the variables the client has registered and sends a challenge with a fresh nonce. The client has a short deadline to answer with the current integrity state and claimed value for each challenged variable; the server re-derives the encoding under the session key and checks that the two agree. Only challenged variables count — extra payloads are ignored, so a client cannot farm clean matches on variables it was not asked about.
Two slower timers run alongside: a periodic variable inventory, and, for sessions that opted into the per-session key handshake, periodic key rotation.
These intervals are fixed defaults in the server source. They are not configurable from the dashboard; changing them means changing the server you host.
Score Accumulation
Each player has one integer suspicion score. It starts at 0, never goes below 0, and every scored event moves it by a fixed amount defined in the server source:
The score is accumulative: a single failed check sits well below the first action threshold, and matches in between pull it back down, so an honest player with the occasional network hiccup never approaches action while a persistent tamperer climbs steadily toward it.
Action Thresholds
After every scored response the server derives an action from the score. Whenever the action is not none, it sends the client a VERDICTmessage and the SDK hands the action to your verdict callback. The integrity server does not close the connection or ban anyone itself — what your game does on warn, escalate and kick is your decision.
The thresholds are fixed in the server source and are not editable from the dashboard.
False Positive Handling
None of this makes a false positive impossible. The consistency check itself is exact — an integrity state is either consistent with the claimed value under the session key or it is not — but the missed-check path depends on network timing, and the bounding envelope is a plausibility model you write. Keep a variable in shadow until its logs look clean.
Reading the Score
Two REST endpoints on the integrity server return a player's current score. Both require the project API key in the X-Compuon-Key header and are scoped to that project: a key for project A only sees players observed under project A, and an unknown player returns 0.
varCountis the number of variables registered by the player's live session, or 0 if the player is not currently connected (the score still persists in server memory until it decays). addressCount is how many distinct source addresses that player has been seen from; it is reported as evidence and is never scored, since an honest client changes address on a network handover. It is recorded only for a project the server runs in key-identity mode (CLOUD_KEY_IDENTITY_PROJECTS— one API key per policed party, as in a contest or a per-seat licence, where the score is kept under the key rather than under the client-declared player id); for the default mode, where one project key is shared by every player, it is always 0. Scores are held in memory only — there is no detection history, per-variable log or export. The dashboard's detection feed is not yet fed by the integrity server; the VERDICT message and these two endpoints are the integration surface today.