esc

One call in. A signed verdict out.

SigChain Guard is hardware-backed anti-cheat for Unity VR. The headset’s secure hardware attests the session, our server runs it through eight gates, and SCG.Validate() hands your game a result it can act on. One Unity package. One call.

Engine
Unity 6 (6000.x) · Unity 2022.3 LTS
Target
Android API 29+ · Meta Quest today; Pico and other Android VR headsets with a hardware TEE planned
Status
Private beta · accounts are invite-only while the SDK is hardened
GameManager.csC#
using SigChainGuard;using UnityEngine; public class GameManager : MonoBehaviour{    async void Start()    {        SCGResult result = await SCG.Validate();         if (result == SCGResult.PASSED)        {            LoadGame();  // verified; forward the token        }        else if (result == SCGResult.FAILED)        {            // your call: kick, ban, or flag        }        else if (result == SCGResult.NO_CONNECTION)        {            // offline; not a failure        }    }}
SCG.Validate() · one session
  1. challengeNonce issued by the server — single use, 30-second lifetime
  2. attestHeadset signs the nonce inside its secure hardware
  3. sealPayload sealed and sent with the bridge hash and timestamp
  4. gatesEight gates evaluated, in order
  5. verdictPASSED — signed token returned

result
PASSED
token
Signed JWT, valid 5 minutes — 60 seconds when Photon custom auth is on.
you
Load the game. Forward the token to your own server, or to Photon as a custom-auth parameter, and it is verified server-side on every room join.
result
FAILED
token
None. A failed session gets nothing your game can be tricked with.
you
Decide: kick, ban, or flag for review. SCG never bans on its own, and the reason stays in your dashboard, not on the client.
result
NO_CONNECTION
token
None — and it is not a security failure.
you
Allow limited offline play if that suits your game, and validate again when the connection returns.

1.0 Import the package

Register your game in the dashboard by uploading your signed APK. SCG extracts the certificate fingerprint and package name itself, and your API key is bound to that certificate — a re-signed or repackaged build presents a different certificate and is turned away.

Download the .unitypackage from the dashboard, import it, then open Window → SigChain Guard → Setup and paste the key. The setup window’s Fix All checks your project settings and resolves the common integration problems for you.

Installation, step by step
Engine
Unity 6 (6000.x) · Unity 2022.3 LTSTested on Unity 6.4 and 2022.3
Android
API 29+ (Android 10)Required for hardware attestation
Headsets
Meta Quest and Android VR with a hardware TEEAny distribution: store, sideloaded, dev build
Package
One .unitypackageC# API · Java bridge · native arm64-v8a library
Account
A registered game and an API keyRegister by uploading your signed APK
Network
Meta Store, AppLab or noneNo dependency on Google Play Services or Meta’s platform SDK

2.0 Call Validate() at start

One async call in your start logic. The native bridge collects the hardware attestation, seals the payload, and sends it to SCG’s server; your game has the result before any gameplay code runs.

Re-validation is not automatic. When you want a fresh verdict mid-session — after a suspicious event, before a ranked match — call ReValidate(). It runs the same full pipeline and the bridge limits it to once every two minutes per player.

Full SDK reference
MethodReturnsWhat it does
SCG.Validate()Task<SCGResult>Full validation. Run it at start; it also tracks the player’s HWID.
SCG.ReValidate()asyncThe same eight gates, mid-session, when you ask. Bridge-limited to once per 2 minutes per player.
SCG.ValidatePS()asyncChecks your configured Photon endpoint. Returns PHOTON_ONLINE or NO_CONNECTION_NOPS.
SCG.HWIDPlayer()asyncRegisters the player’s hashed device ID against your game.

3.0 Eight gates, server-side

The client never grades itself. The sealed payload goes to SCG’s server, which runs eight gates in order. Any failure stops the pipeline — the game gets an error code or FAILED, never a token. Before gate two it also checks bans: yours, the network blacklist, and the cross-game threshold you configure.

One of these is hardware-proven. Gate 6 rests on a certificate chain signed inside the headset’s secure hardware; gates 1–5 and 7 are checks the server makes against its own records. Gate 8’s software signals are collected by the SDK on the device and sealed for transit — evidence you weight, not proof.

  1. 01Required fieldsThe sealed payload, bridge hash, nonce and timestamp are all present.SCG_INVALID_PAYLOAD
  2. 02SDK version and bridgeThe SDK version is known and above the minimum you allow; the bridge binary’s hash matches the one we shipped for that version.SDK_OUTDATED/SDK_FAILED
  3. 03TimestampThe payload was built within 30 seconds of server time. Captured requests go stale fast.TIMESTAMP_INVALID
  4. 04Single-use nonceIssued to this game, unexpired (30-second lifetime) and never seen before. Consumed atomically, so two copies of one request cannot both pass.NONCE_INVALID
  5. 05SDK not deprecatedVersions we have retired are refused outright.SDK_OUTDATED
  6. 06Hardware attestation hardware-provenThe part a decompiler cannot forge. The certificate chain signed in the headset’s secure hardware must chain to the manufacturer’s root, report verified boot and a locked bootloader, carry this session’s nonce, and name your package and signing certificate.TEE_FAILED + reason
  7. 07Baseline fingerprintPackage name and certificate fingerprint match the baseline the server learned when you registered the game.BASELINE_MISMATCH
  8. 08Your configured checks client-reportedRoot, hook frameworks, debugger, ADB, developer mode, installer source. In the dashboard each one is an instant fail, a flag that counts toward a limit, or ignored — your rules.FAILED

Gates 1–7 answer with an error and no verdict. From the ban checks onward, anything that is a judgement about a real, identified device — a ban, gate 8, the network fail-rate — comes back as a 200 with result: FAILED. A 200 is not a pass; read the result.

4.0 The verdict, and what you do with it

PASSED arrives with a signed token — a JWT your own server can verify, valid for five minutes, or sixty seconds when Photon custom auth is on. FAILED arrives with nothing.

SCG reports; you decide. A failure can be a kick, a ban or a quiet flag, you can whitelist specific device IDs, and you choose which of gate 8’s signals count. Ban a device in your game with cross-game banning on and it is flagged across every SCG-protected game — the newest game inherits every ban before it.

Using Photon? Pass the token as a custom-auth parameter before ConnectUsingSettings(). SCG verifies it server-side on every room join, so a bypassed client still cannot walk into a lobby.

All 17 SCGResult values
SCGResultKindMeaning
PASSEDpassAll eight gates passed. Token issued.
FAILEDfailA check failed, or the device is banned here or on the network. Reason is in your dashboard, not on the client.
NO_CONNECTIONwarnNo internet. Not a security failure; your game decides.
SDK_OUTDATEDfailThe integrated SDK is below the minimum version. Update from the dashboard.
RATE_LIMITEDwarnReValidate() called inside its two-minute window, or the game hit its per-minute ceiling.
QUOTA_EXCEEDEDwarnThe plan’s monthly active users are past the grace allowance.
AUTH_PAUSEDwarnYou paused validation from the dashboard toggle.
CHECK_DASHBOARDfailSubscription lapsed, key inactive, or game registration incomplete.
BACKEND_TIMEOUTwarnThe server did not answer in time. Retry.

Known limits, stated up front

A security tool that oversells itself is one you should not trust. These are the edges of what SCG does.

Re-validation is manual.
Nothing re-checks in the background. Passing at launch is a verdict about launch; call ReValidate() when a fresh one matters, at most every two minutes per player.
Device identity is strong, not absolute.
The HWID is a hash of hardware-backed signals a normal app can read. A factory reset or certain OS updates can change it, so we re-detect returning cheaters rather than pretend the ID is permanent.
Software signals are reported, not proven.
Root, hook, debugger, ADB and developer-mode flags come from the SDK’s own checks on the device. Hardware attestation is the part a repacked build cannot reproduce; treat gate 8 as input to moderation.
Root changes the calculus.
On a locked, non-rooted headset we know no way to produce a passing attestation without the secure hardware. An unlocked bootloader or root changes that — which is exactly why those signals are surfaced to you.
Offline is not a failure.
NO_CONNECTION is a distinct result. Your game decides what limited play looks like; validate again on reconnect.
What SCG collects.
Hashed device identity, APK certificate data, attestation results and scan results. No names, accounts, emails or locations, and device data is hashed before it leaves the headset. Details in the privacy policy.

The honest FAQ

Straight answers. Where a figure has not been measured yet, the answer says so instead of guessing.

All pricing questions
Can modders bypass SCG by decompiling the APK?

Decompiling exposes the SDK’s logic, but the security does not depend on that logic staying secret. Validation is gated on an attestation certificate signed inside the headset’s secure hardware, and the server verifies that it chains to the manufacturer’s hardware root. Full APK access still does not let an attacker produce a passing certificate without compromising that hardware — which, on a locked, non-rooted headset, we have no known method for. Root or an unlocked bootloader changes the calculus, which is exactly why device-integrity and root signals are surfaced to you.

What happens if SCG flags a legitimate player?

SCG never bans on its own: it reports signals and you choose the action, which is the real defence against false positives. You can whitelist specific device IDs, tune which checks count as a failure, and decide whether a failure is a soft warning or a hard block. We are early on a young platform, so expect edge cases — OS updates, unusual hardware, reprovisioned devices. Treat the result as input to moderation, not a verdict.

How does cross-game banning work — and what are its limits?

Each device gets a hashed ID built from hardware-backed values a normal app can read. Ban that ID with cross-game banning on and the device is flagged across SCG-protected games. The honest limit: those values can change after a factory reset or certain OS updates, so device identity is treated as strong but not absolute, and we are moving toward a multi-signal model. We will not pretend a non-privileged app can read an unchangeable hardware serial.

Does it work without the Meta Store or AppLab?

Yes. Distribution does not matter — Meta Store, AppLab, sideloaded or a dev build — on Meta Quest and Android VR headsets with a hardware TEE. There is no dependency on Google Play Services or Meta’s platform SDK.

What if a player has no internet?

Validate() returns NO_CONNECTION, which is not a failure. Your game decides what an offline session may do; we recommend allowing limited offline play and validating again on reconnect.

Will it slow down my game?

It is one async call in your start logic, awaited before gameplay code runs, and there is no background loop afterwards — re-validation runs only when you call ReValidate(). We have not published a verdict time or a build-size figure; those wait for measurements on real headsets.

What data does SCG collect?

Hardware identity signals — hashed device fingerprints, APK certificate data, attestation results — and the security-scan results. No personally identifiable information. Device data is hashed before it leaves the headset and is never stored in plaintext. Full details are in the privacy policy.

About integrating

Which headsets are supported?

Meta Quest 2, Quest 3 and Quest Pro. Pico and other Android VR headsets with a hardware TEE are on the roadmap — we plan to expand to them where the hardware allows — but they are not supported today: our focus is getting Meta Quest right first. A headset is listed as supported only once it has passed hardware testing. PC VR is planned for a later release.

Which Unity versions and Android API level?

Unity 6 (6000.x) and Unity 2022.3 LTS — tested on Unity 6.4 and 2022.3. Android API level 29 (Android 10) or higher is required, because that is where hardware TEE attestation becomes available to an app.

Can I call SCG.Validate() more than once?

It runs once per session and returns the cached verdict after that, so calling it again is free and harmless. When you need a fresh verdict — after a long session, or when a player returns from offline — call SCG.ReValidate(); the bridge limits how often it can actually re-run.

Why does every call return CHECK_DASHBOARD?

Your API key is not verified yet, or the account is paused. An API key only starts returning real verdicts once BTKV — the step that proves you own the app you are registering — is complete, and the account is active. Finish that in the dashboard and the same key starts working without a rebuild.

What if my API key leaks?

Rotate it from the dashboard. Rotation asks for your password again, mints a new key for the same game, and keeps the old one working for seven days so a build already in store review is not stranded. After that the old key answers SCG_API_KEY_RETIRED so you can tell a stale build from a forgery. Only rotate if the key has leaked — changing plan never needs a new key.

Is server-side verification available on every plan?

Yes. JWT verification for your own game server is on every plan including Starter — you should never need a higher tier just to check a verdict server-side.

About money

What counts as a monthly active player?

One device that validated at least once in the calendar month. Once or five hundred times, it counts once. Devices that fail hardware attestation are never counted, so you are not charged for cheaters or for attack traffic.

What happens if I go over my player limit?

Nothing breaks straight away. Up to 110% of your limit everything runs normally, with a warning in your dashboard. Between 110% and 125% it keeps running and we tell you clearly — a dashboard banner and a Discord alert. Only sustained overage beyond 125% is enforced, after a three-day grace period from when you first cross it. Your players should never be locked out because your game did well.

Does attack traffic count against my quota?

No. Your quota is metered on successful, hardware-attested validations. Anyone hitting the endpoint with an extracted API key fails attestation, so their requests are rejected without touching your limit — and they land in a separate abuse bucket that cannot starve your real players.

What is the validations-per-minute limit for?

It is the throughput ceiling for your game: how many players can be verified per minute at peak. Starter’s 120 a minute comfortably covers a few thousand monthly players; a game with tens of thousands of concurrent sessions needs Growth or Studio. Your dashboard tells you if you actually hit it, and suggests an upgrade only when one would genuinely help.

Can I switch plans mid-cycle?

Yes. Upgrades take effect immediately and are prorated. Downgrades apply at the end of the current billing period, so you keep what you paid for.

How does annual billing work?

You pay for ten months and get twelve — about 17% off. Billed once a year, same features, cancel before renewal at any time.

What does “unlimited” mean on Studio?

Genuinely unlimited games and players under normal commercial use; there is no hidden counter. If a single title reaches a scale where a flat fee stops making sense for either of us, we come to you and work out a custom plan — no quiet throttling, no surprise invoice.

When do paid plans actually open?

After the private beta. Right now accounts are invite-only and nothing is charged — no card, no billing. The prices are published early so you can plan, and they may still change before public launch.

Planned pricing

Shown for transparency during the private beta. Paid plans open after beta — no card, no charge yet — and prices may change before launch. You pay for players we actually verify: not seats, not requests, not attacks.

Starter

For solo devs shipping their first game

$29/ month

or $290 / year — two months free

$14.50 per 1,000 players · 2,000 MAU


  • 1 game registered
  • 2,000 monthly active players
  • 120 validations / minute
  • Full 8-gate validation pipeline
  • HWID tracking & bans
  • Result JWT for Unity
  • Email support

Paid plans aren’t open yet

Growth

Best value

For games that are taking off

$89/ month

or $890 / year — two months free

$3.56 per 1,000 players — 4× cheaper than Starter


  • 3 games registered
  • 25,000 monthly active players
  • 1,200 validations / minute
  • Everything in Starter
  • Photon join validation
  • Cross-game ban network
  • HWID tracking + export
  • Priority support

Paid plans aren’t open yet

Studio

For teams running multiple titles

$229/ month

or $2,290 / year — two months free

Flat rate · unlimited players — cost per player keeps falling as you scale


  • Unlimited games
  • Unlimited monthly active players
  • 12,000 validations / minute
  • Everything in Growth
  • Raw validation data
  • Custom webhooks
  • Discord priority support

Paid plans aren’t open yet

Attack traffic is free
The meter counts hardware-attested players only. Requests that fail attestation — including anyone flooding the endpoint with an extracted key — never touch your quota.
Going over does not stop your game
Everything runs normally to 110% of your limit, keeps running with a clear warning to 125%, and only sustained overage past that is enforced.
“Unlimited” means normal commercial use
If a single title reaches a scale where a flat fee stops making sense, we come to you first. Full pricing and FAQ →

In private beta with four partners

“Works really well out of the box. If you know basic C# the docs walk you through everything clearly. The dashboard is the standout — toggling custom auth on and off without touching code is genuinely useful. Would recommend it to anyone building a VR multiplayer game.”

Read the pipeline before you trust it.

Every gate, every result code and every limit above is in the documentation in more detail than a homepage should carry. Start there.