addedInput schema / definitions / ClientPlatform
Added value: +{
+ "description": "",
+ "enum": [
+ "Unknown",
+ "Web",
+ "Android",
+ "Ios"
+ ],
+ "type": "string",
+ "x-enum-descriptions": [
+ "Platform was not reported, or the reported one contradicts the request fingerprint.",
+ "Browser: web build, WebGL, or a messenger mini-app.",
+ "Android build (Google Play Billing).",
+ "iOS / iPadOS build (App Store, StoreKit)."
+ ],
+ "x-enumNames": [
+ "Unknown",
+ "Web",
+ "Android",
+ "Ios"
+ ]
+}
addedInput schema / definitions / ExperimentVariantCondition
Added value: +{
+ "description": "Experiment-variant membership condition — embedded in SegmentGate.Experiment. The gate passes if the player is assigned to one of Variants of experiment ExperimentID (empty list = just enrolled). A/B variants thus reuse the whole SegmentGate stack: make two configs (offer A, offer B), each gated to its variant.",
+ "properties": {
+ "ExperimentID": {
+ "description": "Experiment ID whose assignment is checked.",
+ "type": [
+ "null",
+ "string"
+ ]
+ },
+ "Variants": {
+ "description": "Allowed variants (any-of). Empty = being assigned to any variant is enough (enrolled). A player with no assignment for this experiment does NOT pass.",
+ "items": {
+ "type": "string"
+ },
+ "type": [
+ "array",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+}
addedInput schema / definitions / ReferralCondition
Added value: +{
+ "description": "One invite qualification condition. Which fields are used depends on Type.",
+ "properties": {
+ "Balance": {
+ "description": "CryptoBalance: token balance requirement, same shape as a play-access token gate (CurrencyID, NetworkID, MinBalance, BalanceSource OnChain/Combined/InGame). OnChain/Combined need a signature-verified wallet and are checked on login, refresh and Referral/CheckQualification.",
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/definitions/WalletPlayTokenGate"
+ }
+ ]
+ },
+ "CurrencyID": {
+ "description": "CryptoDeposited: crypto currency id (cfg.Currency.CryptoCurrencies) deposited into the game.",
+ "type": [
+ "null",
+ "string"
+ ]
+ },
+ "MinAmount": {
+ "description": "CryptoDeposited: minimum total deposited, in whole tokens, over the player's lifetime.",
+ "format": "decimal",
+ "type": "number"
+ },
+ "MinValue": {
+ "description": "Threshold for AccountAgeHours, Sessions, ActiveDays and PlayTimeMinutes.",
+ "format": "int64",
+ "type": "integer"
+ },
+ "QuestID": {
+ "description": "QuestCompleted: quest id that must be completed (or claimed).",
+ "type": [
+ "null",
+ "string"
+ ]
+ },
+ "Segment": {
+ "description": "Segment: audience gate the player must pass (level, premium, country, tutorial, platform).",
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/definitions/SegmentGate"
+ }
+ ]
+ },
+ "Type": {
+ "description": "Condition kind: NotGuest, AccountAgeHours, Sessions, ActiveDays, PlayTimeMinutes, Segment, QuestCompleted, WalletLinked, CryptoDeposited, CryptoBalance.",
+ "oneOf": [
+ {
+ "$ref": "#/definitions/ReferralConditionType"
+ }
+ ]
+ }
+ },
+ "type": "object"
+}
addedInput schema / definitions / ReferralConditionGroup
Added value: +{
+ "description": "One group of conditions: all of them must be met.",
+ "properties": {
+ "Conditions": {
+ "description": "Conditions of the group (AND).",
+ "items": {
+ "$ref": "#/definitions/ReferralCondition"
+ },
+ "type": [
+ "array",
+ "null"
+ ]
+ },
+ "GroupID": {
+ "description": "Optional group id for the UI.",
+ "type": [
+ "null",
+ "string"
+ ]
+ }
+ },
+ "type": "object"
+}
addedInput schema / definitions / ReferralConditionType
Added value: +{
+ "description": "",
+ "enum": [
+ "NotGuest",
+ "AccountAgeHours",
+ "Sessions",
+ "ActiveDays",
+ "PlayTimeMinutes",
+ "Segment",
+ "QuestCompleted",
+ "WalletLinked",
+ "CryptoDeposited",
+ "CryptoBalance"
+ ],
+ "type": "string",
+ "x-enumNames": [
+ "NotGuest",
+ "AccountAgeHours",
+ "Sessions",
+ "ActiveDays",
+ "PlayTimeMinutes",
+ "Segment",
+ "QuestCompleted",
+ "WalletLinked",
+ "CryptoDeposited",
+ "CryptoBalance"
+ ]
+}
addedInput schema / definitions / ReferralQualificationDefinition
Added value: +{
+ "description": "Invite qualification: the invite counts when ANY group is met; a group is met when ALL its conditions are met.",
+ "properties": {
+ "Enabled": {
+ "description": "Whether the conditions apply. False = invites count immediately.",
+ "type": "boolean"
+ },
+ "Groups": {
+ "description": "Alternative groups of conditions (OR between groups, AND inside a group).",
+ "items": {
+ "$ref": "#/definitions/ReferralConditionGroup"
+ },
+ "type": [
+ "array",
+ "null"
+ ]
+ }
+ },
+ "type": "object"
+}
addedInput schema / definitions / SegmentGate
Added value: +{
+ "description": "Unified \"who it is available/applies to\" gate. Replaces BoostSegmentGate (TimedBoost), MailboxSegmentDefinition filters and StoreOfferRules premium fields. All conditions are AND-ed. An empty/unset field = no constraint on that axis; an empty/null gate = available to everyone. Resolved by SegmentGateEvaluator.Passes.",
+ "properties": {
+ "ActiveWithinDays": {
+ "description": "Active within the last X days (matches Usage.LastActiveAt). 0 = no restriction.",
+ "format": "int32",
+ "type": "integer"
+ },
+ "Countries": {
+ "description": "Country filter (ISO 3166-1 alpha-2; matches PublicData.Country, else RegistrationCountry). Empty = all countries.",
+ "items": {
+ "type": "string"
+ },
+ "type": [
+ "array",
+ "null"
+ ]
+ },
+ "Experiment": {
+ "description": "A/B experiment condition: the gate passes only if the player is assigned to the required variant (ExperimentVariantCondition). null = not applied. A/B variants thus reuse the whole SegmentGate stack: two configs, each gated to its variant. Assignment is read from UserDataDocument.Experiments (sticky, stable-hash — see ExperimentAssigner).",
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/definitions/ExperimentVariantCondition"
+ }
+ ]
+ },
+ "MaxLevel": {
+ "description": "Maximum Board Rank. 0 = no upper bound.",
+ "format": "int64",
+ "type": "integer"
+ },
+ "MinLevel": {
+ "description": "Minimum Board Rank (matches PublicData.BoardRank). 0 = no lower bound.",
+ "format": "int64",
+ "type": "integer"
+ },
+ "MinPremiumTier": {
+ "description": "Minimum active premium tier (matches Premium.MaxActiveTier). 0 = no requirement.",
+ "format": "int32",
+ "type": "integer"
+ },
+ "Platforms": {
+ "description": "Platforms the entity is available on. Empty/null = all. Unlike the other axes this one comes from the request platform (IGSService.ClientPlatform), not from the player document, and is passed to SegmentGateEvaluator.Passes as a separate REQUIRED argument. The axis is skipped when the platform is Unknown — deliberately soft, because it governs what is shown, not what is charged: payments are guarded by PriceOptionSelector.IsAvailableOn, where Unknown does not pass a non-empty platform list. Not needed to hide entities that simply cannot be paid for on a platform: storefronts already drop whatever has no available price option.",
+ "items": {
+ "$ref": "#/definitions/ClientPlatform"
+ },
+ "type": [
+ "array",
+ "null"
+ ]
+ },
+ "RegisteredWithinDays": {
+ "description": "Registered no earlier than X days ago (new players; matches RegistrationDate). 0 = no restriction.",
+ "format": "int32",
+ "type": "integer"
+ },
+ "RequiredPremiumIDs": {
+ "description": "Required active premium IDs (ANY of the list is enough, via PremiumHelpers.GetActivePremiumIDs). Empty = no requirement.",
+ "items": {
+ "type": "string"
+ },
+ "type": [
+ "array",
+ "null"
+ ]
+ },
+ "Segments": {
+ "description": "Allowed economy segments (matches PlayerEconomyTuningState.Segment: \"F2P\",\"Dolphin\",\"Whale\",\"VIP\"). Empty = any.",
+ "items": {
+ "type": "string"
+ },
+ "type": [
+ "array",
+ "null"
+ ]
+ },
+ "Tutorial": {
+ "description": "Tutorial condition: the gate passes only if the player is in the required progression state (TutorialGateCondition). null = not applied. By the same trick as Experiment, this gives \"after onboarding\" gating in every module already using SegmentGate, with no edits to them. To close a whole module there is a cheaper path — TutorialGlobalSettings.Blocking: one check in ClientRun instead of a condition on every entity.",
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/definitions/TutorialGateCondition"
+ }
+ ]
+ }
+ },
+ "type": "object"
+}
addedInput schema / definitions / TutorialGateCondition
Added value: +{
+ "description": "\"The player finished the tutorial\" condition — embedded in SegmentGate.Tutorial exactly as ExperimentVariantCondition is embedded in SegmentGate.Experiment. Thanks to that, tutorial gating works for free in EVERY module already using SegmentGate (Store / DealOffer / Quest / Reward / Leaderboard / ...). This is the per-entity gating level; to close a whole module use TutorialBlockingPolicy, which is cheaper.",
+ "properties": {
+ "FlowIDs": {
+ "description": "Flows whose state is checked. Empty = the condition is not applied (the gate passes). Multiple entries are AND-ed: \"after the intro AND after the raid tutorial\".",
+ "items": {
+ "type": "string"
+ },
+ "type": [
+ "array",
+ "null"
+ ]
+ },
+ "Mode": {
+ "description": "What exactly must hold for those flows. Default Completed.",
+ "oneOf": [
+ {
+ "$ref": "#/definitions/TutorialGateMode"
+ }
+ ]
+ },
+ "Negate": {
+ "description": "Invert the condition. Needed for the reverse case — \"show this starter offer ONLY to players still in the tutorial\". Default false.",
+ "type": "boolean"
+ },
+ "SkippedCountsAsCompleted": {
+ "description": "Whether a Skipped flow counts as finished under Mode = Completed. Default true: if the publisher allowed skipping, the skipper must get the same game as the completer.",
+ "type": "boolean"
+ },
+ "StepID": {
+ "description": "The step that must be reached. Read only when Mode = StepReached, and applied to every flow in FlowIDs.",
+ "type": [
+ "null",
+ "string"
+ ]
+ }
+ },
+ "type": "object"
+}
addedInput schema / definitions / TutorialGateMode
Added value: +{
+ "description": "",
+ "enum": [
+ "Completed",
+ "Started",
+ "StepReached"
+ ],
+ "type": "string",
+ "x-enum-descriptions": [
+ "The flow is finished. Default.",
+ "The flow is started (in progress or already finished).",
+ "A specific step has been reached (TutorialGateCondition.StepID)."
+ ],
+ "x-enumNames": [
+ "Completed",
+ "Started",
+ "StepReached"
+ ]
+}
addedInput schema / definitions / WalletGateBalanceSource
Added value: +{
+ "description": "",
+ "enum": [
+ "OnChain",
+ "Combined",
+ "InGame"
+ ],
+ "type": "string",
+ "x-enumNames": [
+ "OnChain",
+ "Combined",
+ "InGame"
+ ]
+}
addedInput schema / definitions / WalletPlayTokenGate
Added value: +{
+ "description": "One wallet-balance requirement for play access. Token contract and on-chain decimals are resolved from CryptoCurrencyDefinition.Networks by (CurrencyID, NetworkID), not duplicated here.",
+ "properties": {
+ "BalanceSource": {
+ "description": "Where to read the balance compared against MinBalance: OnChain (wallet balance via RPC only), Combined (on-chain + in-game available balance InventoryV2.CryptoCurrencies[CurrencyID].Amount, excluding Frozen), InGame (in-game available balance only; no wallet, no RPC, NetworkID ignored). Default OnChain.",
+ "oneOf": [
+ {
+ "$ref": "#/definitions/WalletGateBalanceSource"
+ }
+ ]
+ },
+ "CurrencyID": {
+ "description": "CurrencyID (cfg.Currency.CryptoCurrencies) whose balance is checked. Its binding for NetworkID provides ContractAddress (mint for Solana) and Decimals.",
+ "type": [
+ "null",
+ "string"
+ ]
+ },
+ "DenyMessage": {
+ "description": "Optional custom denial message shown to the client (otherwise a default text is used).",
+ "type": [
+ "null",
+ "string"
+ ]
+ },
+ "Enabled": {
+ "description": "Whether the requirement is active. False skips this gate (does not block).",
+ "type": "boolean"
+ },
+ "MinBalance": {
+ "description": "Minimum balance in whole units (e.g. 1000 = 1000 game tokens).",
+ "format": "decimal",
+ "type": "number"
+ },
+ "NetworkID": {
+ "description": "Network this gate applies to (key from Blockchain.Networks).",
+ "type": [
+ "null",
+ "string"
+ ]
+ }
+ },
+ "type": "object"
+}
addedInput schema / properties / value / properties / Qualification
Added value: +{
+ "description": "Conditions an invited player must meet before the invite counts (anti-farming, and invite leaderboards that count only real players). Until met, everything waits: the referrer's +1 (invite milestones), ReferralInvite event tokens and leaderboard points, the spend kickback and the invitee's activation reward. No deadline. Null or disabled = the invite counts immediately on binding.",
+ "oneOf": [
+ {
+ "type": "null"
+ },
+ {
+ "$ref": "#/definitions/ReferralQualificationDefinition"
+ }
+ ]
+}