Skip to main content

GameProductService

This item only works when running on the server. Server

This service provides an interface to purchase produces, assets, and other marketplace items. This listens to events, handles requests between server and client, and takes in both assetKeys from GameConfigService, as well as assetIds.

See GameProductServiceClient for the client equivalent. The API surface should be effectively the same between the two.

Functions

Init

GameProductService.Init(
serviceBagServiceBag
) → ()

Initializes the service. Should be done via ServiceBag

ObservePlayerAssetPurchased

GameProductService.ObservePlayerAssetPurchased(
playerPlayer,
assetTypeGameConfigAssetType,
idOrKeystring | number
) → Observable<>

Fires when the specified player purchases an asset

ObserveAssetPurchased

GameProductService.ObserveAssetPurchased(
assetTypeGameConfigAssetType,
idOrKeystring | number
) → Observable<Player>

Fires when any player purchases an asset

HasPlayerPurchasedThisSession

GameProductService.HasPlayerPurchasedThisSession(
playerPlayer,
assetTypeGameConfigAssetType,
idOrKeystring | number
) → boolean

Returns true if item has been purchased this session

PromisePlayerIsPromptOpen

GameProductService.PromisePlayerIsPromptOpen(
playerPlayer
) → Promise<boolean>

Returns true if the prompt is open

PromisePlayerPromptClosed

GameProductService.PromisePlayerPromptClosed(
playerPlayer
) → Promise

Returns a promise that will resolve when all prompts are closed

PromisePlayerPromptPurchase

GameProductService.PromisePlayerPromptPurchase(
playerPlayer,
assetTypeGameConfigAssetType,
idOrKeystring | number
) → boolean

Prompts the user to purchase the asset, and returns true if purchased

PromisePlayerOwnership

GameProductService.PromisePlayerOwnership(
playerPlayer,
assetTypeGameConfigAssetType,
idOrKeystring | number
) → Promise<boolean>

Returns true if item has been purchased this session

SetPlayerOwnershipOverride

GameProductService.SetPlayerOwnershipOverride(
playerPlayer,
assetTypeGameConfigAssetType,
idOrKeystring | number,
ownsAssetboolean?
) → Promise

Sets a server-authoritative override for the player's ownership of the asset. When set, the override wins over the cloud query and any session purchase, forcing ownership on (true) or off (false). Passing nil clears the override.

The override is replicated read-only to the client and applied to every realm's ownership tracker, so it drives client-side ownership-gated UI. Useful for testing ownership-gated behavior (including paid-access games, which cannot be prompted in-experience) or granting access from a non-Roblox condition. Only the server may set it; the client has no setter, so a player can never grant themselves ownership.

ClearPlayerOwnershipOverride

GameProductService.ClearPlayerOwnershipOverride(
playerPlayer,
assetTypeGameConfigAssetType,
idOrKeystring | number
) → Promise

Clears any local ownership override for the asset, so ownership falls back to the cloud query. Equivalent to SetPlayerOwnershipOverride(player, assetType, idOrKey, nil).

PromisePlayerOwnershipOrPrompt

GameProductService.PromisePlayerOwnershipOrPrompt(
playerPlayer,
assetTypeGameConfigAssetType,
idOrKeystring | number
) → Promise<boolean>

Checks if the asset is ownable and if it is, checks player ownership. Otherwise, it checks if the asset has been purchased this session. If the asset has not been purchased this session it prompts the user to purchase the item.

ObservePlayerOwnership

GameProductService.ObservePlayerOwnership(
playerPlayer,
assetTypeGameConfigAssetType,
idOrKeystring | number
) → Observable<boolean>

Observes if the player owns this cloud asset or not

SetServerOnlyPromptingEnabled

GameProductService.SetServerOnlyPromptingEnabled(
enabledboolean
) → ()

Restricts purchase prompting to the server. When enabled, clients can no longer prompt purchases directly via GameProductServiceClient:PromisePromptPurchase (it rejects); prompts must be initiated from the server, where the developer can validate the asset id. Defaults to disabled.

IsServerOnlyPromptingEnabled

GameProductService.IsServerOnlyPromptingEnabled(selfGameProductService) → boolean

Returns true if server-only prompting is enabled.

Destroy

GameProductService.Destroy(selfGameProductService) → ()

Cleans up the game product service

Show raw api
{
    "functions": [
        {
            "name": "Init",
            "desc": "Initializes the service. Should be done via [ServiceBag]",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "GameProductService"
                },
                {
                    "name": "serviceBag",
                    "desc": "",
                    "lua_type": "ServiceBag"
                }
            ],
            "returns": [],
            "function_type": "static",
            "source": {
                "line": 49,
                "path": "src/gameproductservice/src/Server/GameProductService.lua"
            }
        },
        {
            "name": "ObservePlayerAssetPurchased",
            "desc": "Fires when the specified player purchases an asset",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "GameProductService"
                },
                {
                    "name": "player",
                    "desc": "",
                    "lua_type": "Player"
                },
                {
                    "name": "assetType",
                    "desc": "",
                    "lua_type": "GameConfigAssetType"
                },
                {
                    "name": "idOrKey",
                    "desc": "",
                    "lua_type": "string | number"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Observable<>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 82,
                "path": "src/gameproductservice/src/Server/GameProductService.lua"
            }
        },
        {
            "name": "ObserveAssetPurchased",
            "desc": "Fires when any player purchases an asset",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "GameProductService"
                },
                {
                    "name": "assetType",
                    "desc": "",
                    "lua_type": "GameConfigAssetType"
                },
                {
                    "name": "idOrKey",
                    "desc": "",
                    "lua_type": "string | number"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Observable<Player>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 102,
                "path": "src/gameproductservice/src/Server/GameProductService.lua"
            }
        },
        {
            "name": "HasPlayerPurchasedThisSession",
            "desc": "Returns true if item has been purchased this session",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "GameProductService"
                },
                {
                    "name": "player",
                    "desc": "",
                    "lua_type": "Player"
                },
                {
                    "name": "assetType",
                    "desc": "",
                    "lua_type": "GameConfigAssetType"
                },
                {
                    "name": "idOrKey",
                    "desc": "",
                    "lua_type": "string | number"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "boolean"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 121,
                "path": "src/gameproductservice/src/Server/GameProductService.lua"
            }
        },
        {
            "name": "PromisePlayerIsPromptOpen",
            "desc": "Returns true if the prompt is open",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "GameProductService"
                },
                {
                    "name": "player",
                    "desc": "",
                    "lua_type": "Player"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise<boolean>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 140,
                "path": "src/gameproductservice/src/Server/GameProductService.lua"
            }
        },
        {
            "name": "PromisePlayerPromptClosed",
            "desc": "Returns a promise that will resolve when all prompts are closed",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "GameProductService"
                },
                {
                    "name": "player",
                    "desc": "",
                    "lua_type": "Player"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 156,
                "path": "src/gameproductservice/src/Server/GameProductService.lua"
            }
        },
        {
            "name": "PromisePlayerPromptPurchase",
            "desc": "Prompts the user to purchase the asset, and returns true if purchased",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "GameProductService"
                },
                {
                    "name": "player",
                    "desc": "",
                    "lua_type": "Player"
                },
                {
                    "name": "assetType",
                    "desc": "",
                    "lua_type": "GameConfigAssetType"
                },
                {
                    "name": "idOrKey",
                    "desc": "",
                    "lua_type": "string | number"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "boolean"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 174,
                "path": "src/gameproductservice/src/Server/GameProductService.lua"
            }
        },
        {
            "name": "PromisePlayerOwnership",
            "desc": "Returns true if item has been purchased this session",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "GameProductService"
                },
                {
                    "name": "player",
                    "desc": "",
                    "lua_type": "Player"
                },
                {
                    "name": "assetType",
                    "desc": "",
                    "lua_type": "GameConfigAssetType"
                },
                {
                    "name": "idOrKey",
                    "desc": "",
                    "lua_type": "string | number"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise<boolean>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 195,
                "path": "src/gameproductservice/src/Server/GameProductService.lua"
            }
        },
        {
            "name": "SetPlayerOwnershipOverride",
            "desc": "Sets a server-authoritative override for the player's ownership of the asset. When set, the\noverride wins over the cloud query and any session purchase, forcing ownership on (`true`) or off\n(`false`). Passing `nil` clears the override.\n\nThe override is replicated read-only to the client and applied to every realm's ownership\ntracker, so it drives client-side ownership-gated UI. Useful for testing ownership-gated behavior\n(including paid-access games, which cannot be prompted in-experience) or granting access from a\nnon-Roblox condition. Only the server may set it; the client has no setter, so a player can never\ngrant themselves ownership.",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "GameProductService"
                },
                {
                    "name": "player",
                    "desc": "",
                    "lua_type": "Player"
                },
                {
                    "name": "assetType",
                    "desc": "",
                    "lua_type": "GameConfigAssetType"
                },
                {
                    "name": "idOrKey",
                    "desc": "",
                    "lua_type": "string | number"
                },
                {
                    "name": "ownsAsset",
                    "desc": "",
                    "lua_type": "boolean?"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 225,
                "path": "src/gameproductservice/src/Server/GameProductService.lua"
            }
        },
        {
            "name": "ClearPlayerOwnershipOverride",
            "desc": "Clears any local ownership override for the asset, so ownership falls back to the cloud\nquery. Equivalent to `SetPlayerOwnershipOverride(player, assetType, idOrKey, nil)`.",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "GameProductService"
                },
                {
                    "name": "player",
                    "desc": "",
                    "lua_type": "Player"
                },
                {
                    "name": "assetType",
                    "desc": "",
                    "lua_type": "GameConfigAssetType"
                },
                {
                    "name": "idOrKey",
                    "desc": "",
                    "lua_type": "string | number"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 249,
                "path": "src/gameproductservice/src/Server/GameProductService.lua"
            }
        },
        {
            "name": "PromisePlayerOwnershipOrPrompt",
            "desc": "Checks if the asset is ownable and if it is, checks player ownership. Otherwise, it checks if the asset\nhas been purchased this session. If the asset has not been purchased this session it prompts the user to\npurchase the item.",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "GameProductService"
                },
                {
                    "name": "player",
                    "desc": "",
                    "lua_type": "Player"
                },
                {
                    "name": "assetType",
                    "desc": "",
                    "lua_type": "GameConfigAssetType"
                },
                {
                    "name": "idOrKey",
                    "desc": "",
                    "lua_type": "string | number"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Promise<boolean>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 272,
                "path": "src/gameproductservice/src/Server/GameProductService.lua"
            }
        },
        {
            "name": "ObservePlayerOwnership",
            "desc": "Observes if the player owns this cloud asset or not",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "GameProductService"
                },
                {
                    "name": "player",
                    "desc": "",
                    "lua_type": "Player"
                },
                {
                    "name": "assetType",
                    "desc": "",
                    "lua_type": "GameConfigAssetType"
                },
                {
                    "name": "idOrKey",
                    "desc": "",
                    "lua_type": "string | number"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "Observable<boolean>"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 293,
                "path": "src/gameproductservice/src/Server/GameProductService.lua"
            }
        },
        {
            "name": "SetServerOnlyPromptingEnabled",
            "desc": "Restricts purchase prompting to the server. When enabled, clients can no longer\nprompt purchases directly via [GameProductServiceClient:PromisePromptPurchase] (it\nrejects); prompts must be initiated from the server, where the developer can validate\nthe asset id. Defaults to disabled.",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "GameProductService"
                },
                {
                    "name": "enabled",
                    "desc": "",
                    "lua_type": "boolean"
                }
            ],
            "returns": [],
            "function_type": "static",
            "source": {
                "line": 314,
                "path": "src/gameproductservice/src/Server/GameProductService.lua"
            }
        },
        {
            "name": "IsServerOnlyPromptingEnabled",
            "desc": "Returns true if server-only prompting is enabled.",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "GameProductService"
                }
            ],
            "returns": [
                {
                    "desc": "",
                    "lua_type": "boolean"
                }
            ],
            "function_type": "static",
            "source": {
                "line": 325,
                "path": "src/gameproductservice/src/Server/GameProductService.lua"
            }
        },
        {
            "name": "Destroy",
            "desc": "Cleans up the game product service",
            "params": [
                {
                    "name": "self",
                    "desc": "",
                    "lua_type": "GameProductService"
                }
            ],
            "returns": [],
            "function_type": "static",
            "source": {
                "line": 332,
                "path": "src/gameproductservice/src/Server/GameProductService.lua"
            }
        }
    ],
    "properties": [],
    "types": [],
    "name": "GameProductService",
    "desc": "This service provides an interface to purchase produces, assets, and other\nmarketplace items. This listens to events, handles requests between server and\nclient, and takes in both assetKeys from GameConfigService, as well as\nassetIds.\n\nSee [GameProductServiceClient] for the client equivalent. The API surface should be\neffectively the same between the two.",
    "realm": [
        "Server"
    ],
    "source": {
        "line": 14,
        "path": "src/gameproductservice/src/Server/GameProductService.lua"
    }
}