server.js
import { NescioClient } from "@nescio/sdk";
const nescio = new NescioClient({ apiKey: process.env.NESCIO_API_KEY });

// 1 · start a verification for a player
const s = await nescio.createVerificationSession();
// → render s.client (a QR) to the player

// 2 · once verified, you get a game-scoped id — no PII
const { subjectId, claims } =
  await nescio.getVerificationSession(s.sessionId);

// same human → same subjectId (Sybil-proof),
// unlinkable to any other game you don't control.
claims; // { verified_human, over_18, issuing_country }

🤖

👥

🔁

🪪

1

2

3

gate-ranked.js
// gate ranked play on a verified, unique human
const { status, subjectId, claims } =
  await nescio.getVerificationSession(sessionId);

if (status === "verified" && claims.over_18) {
  if (bans.has(subjectId)) return deny("banned");
  ranked.admit(subjectId);  // one human, one seat
}

// subjectId is stable for this player, in THIS game only.
// no name · no email · no document · nothing to breach.