If you want your own UI design, you can write a custom Lua key system and paste it directly into the dashboard. Syntrix will serve it instead of the preset when your loader fetches the GUI.
Setting Custom Code
Open your script in the dashboard
Click Key System
Select the Custom Code tab
Paste your Lua code
Save
When saved, GET /api/scripts/:id/keysystem-gui will return your code instead of the generated preset.
Required Variables
Your custom GUI must interact with the Syntrix API. Use these pre-filled variables (swap in your actual script ID):
local chalUrl = "https://dev.syntrx.xyz/api/challenge?scriptId=" .. ScriptId
local chalResp = game:HttpGet(chalUrl)
local chalData = game:GetService("HttpService"):JSONDecode(chalResp)
local challenge = chalData.challenge
local HttpService = game:GetService("HttpService")
local hwid = game:GetService("RbxAnalyticsService"):GetClientId()
local body = HttpService:JSONEncode({
key = userKey,
scriptId = ScriptId,
hwid = hwid,
challenge = challenge,
executor = "MyScript",
placeId = tostring(game.PlaceId),
jobId = tostring(game.JobId),
})
local rf = syn and syn.request or http_request or request
local response = rf({
Url = ValidateUrl,
Method = "POST",
Headers = {
["Content-Type"] = "application/json",
["X-Syntrix-ScriptId"] = ScriptId,
},
Body = body,
})
local data = HttpService:JSONDecode(response.Body)
if data.success and data.payload then
-- Destroy your GUI here
local fn, err = loadstring(data.payload)
if fn then
pcall(fn)
else
warn("[KeySystem] Load error:", err)
end
else
warn("[KeySystem] Auth failed:", data.error or "unknown")
end
local function getRequestFunction()
local rf
pcall(function() if syn and syn.request then rf = syn.request end end)
pcall(function() if not rf and fluxus and fluxus.request then rf = fluxus.request end end)
pcall(function() if not rf and http_request then rf = http_request end end)
pcall(function() if not rf and request then rf = request end end)
return rf
end
local ScriptId = "YOUR_SCRIPT_ID"
local ValidateUrl = "https://dev.syntrx.xyz/api/execute"
local GetKeyUrl = "https://dev.syntrx.xyz/getkey/YOUR_SCRIPT_ID"
local HttpService = game:GetService("HttpService")
local hwid = game:GetService("RbxAnalyticsService"):GetClientId()
local function getChallenge()
local ok, res = pcall(function()
return game:HttpGet("https://dev.syntrx.xyz/api/challenge?scriptId=" .. ScriptId)
end)
if not ok then return nil end
local ok2, data = pcall(HttpService.JSONDecode, HttpService, res)
return ok2 and data and data.challenge or nil
end
local function validateKey(key)
local challenge = getChallenge()
if not challenge then warn("Challenge fetch failed") return end
local rf = (syn and syn.request) or http_request or request
if not rf then warn("No HTTP function") return end
local ok, resp = pcall(rf, {
Url = ValidateUrl,
Method = "POST",
Headers = {["Content-Type"] = "application/json", ["X-Syntrix-ScriptId"] = ScriptId},
Body = HttpService:JSONEncode({
key = key, scriptId = ScriptId, hwid = hwid,
challenge = challenge, placeId = tostring(game.PlaceId)
})
})
if not ok then warn("Request failed:", resp) return end
local data = HttpService:JSONDecode(resp.Body)
if data.success and data.payload then
-- destroy GUI
local fn, err = loadstring(data.payload)
if fn then pcall(fn) else warn(err) end
else
warn("Key invalid:", data.error)
end
end
-- Wire validateKey() to your button