Skip to main content
Each adapter returns the Validate(key) callback required by UI:CreateKeySystem and UI:Launch. The gate invokes it asynchronously. Return true, result to accept a key or false, message to reject it. GetKey is an optional, separate link for users who need to obtain a key. The examples assume the Gabibou UI module is already available in ReplicatedStorage. Provider SDK imports are shown explicitly where the provider documents a client SDK; the library never loads a provider automatically.

Luarmor

The Luarmor adapter accepts the public key-check SDK’s result only when status.code == "KEY_VALID". It does not run the protected script or change script_key. Use a separate SDK table for each ScriptId; reusing one table for the same ID is allowed, but sharing it across different IDs is rejected. Do not change api.script_id after creating the provider; if another script changes it, validation fails closed.
Replace the script ID and key URL with your own. The SDK call can return provider status messages for rejected keys; SDK exceptions become a generic retry message. See the Luarmor key-check documentation for the official SDK and status codes.

Vampauth

Pass the documented Vampauth client SDK module, project ID, and authentication secret. The optional HWID value is omitted below.
AuthSecret is embedded in the client script and can be inspected. Obfuscation does not make it a server-side secret. For a secret that must remain private, validate through a backend you control instead. See Vampauth’s client SDK and documentation.

KeyAuth

KeyAuth has no current official Lua SDK example verified by this guide. Its official SDK page notes that only C++, C#, and Python examples use API v1.3; listed Lua examples use older API versions. Use a Lua-compatible SDK you have reviewed, then map its initialization and license functions to this bridge. The bridge contract is real; keyAuthAdapter below represents your SDK wrapper and must be supplied by you.
Initialization runs lazily once for the provider callback and shares its context across checks. If it fails, or does not finish within 20 seconds, the gate shows an error and the next submission retries. License callbacks can return true, result, false, message, or {success = true, result = ...} / {success = false, message = ...}. A table without a boolean success field is rejected. Do not put a KeyAuth Seller API credential or other owner-only secret in a client script. See KeyAuth’s initialization, license login, and SDK examples.

Custom validator

Use Custom when your existing provider or service has a different API. This local example demonstrates the callback shape only; a hard-coded list in a client script is easy to inspect and bypass, so use it for previews rather than protecting a real service.
For a Roblox experience that protects server actions, route validation to a server-side script and check authorization on each protected action. The server validation example shows a RemoteFunction bridge; HttpService requests and provider credentials belong in a server script, not a LocalScript. The provider’s request and response formats are specific to that service, so there is no universal HTTP key-check endpoint.

Failure behavior

Provider callbacks fail closed: thrown SDK errors and invalid SDK responses reject the current key with a generic retry message. A slow or yielding check keeps the gate single-flight; use gate:Cancel() to cancel that attempt, or destroy the gate when the owning UI is removed. See Key systems for the gate lifecycle, Discord options, and sizing.