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 whenstatus.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.
Vampauth
Pass the documented Vampauth client SDK module, project ID, and authentication secret. The optionalHWID 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.
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
UseCustom 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.
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; usegate: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.