Protect your script
Obfuscation & loaders
Upload and obfuscate scripts, pick an engine, roll out versions with a kill-switch, and route games to scripts with one loader.
Scripts
Obfuscation (sidebar → Access) has two tabs: Scripts and Loaders.
A new script goes through three steps:
- Source — drop a
.lua,.luauor.txtfile or paste the code (up to 10 MB), and set the output file name. - Obfuscator — choose how the script is protected (see Obfuscators).
- Configure — the engine's preset or options.
The whitelist is always embedded, and you get a loader URL:
script_key = "PASTE-YOUR-KEY-HERE"
loadstring(game:HttpGet("https://api.santiauth.com/api/loader/v4/script/<script-id>"))()Each script card has Copy loader, Copy file URL, Download, Statistics (executions, unique users, executors × countries, games, players online now (refreshed every 30 seconds) and session length, an hourly heatmap in UTC or your local time and blocked sessions; click a day on the chart for its hours or turn on vs previous to outline the period before, switch countries between a list and a map), Edit & re-run, Re-obfuscate, Access, versions & kill-switch and Delete script.
- Edit & re-run — change the source or options and build again. The loader URL stays the same.
- Re-obfuscate — rebuild with the latest SantiAuth client, after we announce a client update.
Builds run in the background, for up to 15 minutes. After you start one, the page shows whether it is waiting in the queue, its current stage (preparing, obfuscating, publishing) and the time spent — you can close the tab and come back: running and failed builds are listed above Script library, and the script appears there when it is ready. While a script is rebuilding, players keep getting its current build; if the build fails, nothing changes and any tokens or plan quota it took are given back. Only one build per script runs at a time.
You need edit permission on the service to create or change scripts.
Obfuscators
| Obfuscator | Options | Cost |
|---|---|---|
| SantiAuth | Medium (smaller and faster) or Strong (more scrambling, larger build) preset | Built in, no API key needed |
| Luraph | Target runtime, optimization level, VM structure, compression and more | Plan quota or your own API key |
| wYnfuscate | Security tier, target platform, node, source optimizations | Requires your own API key |
| IronBrew1 | Platform, anti-tamper, VM compression, scrambling | Plan quota or your own API key |
The engine picker shows whether a run is free, uses your quota, or needs your key.
Your own engine keys
Settings → Obfuscation stores your own API keys for Luraph, wYnfuscate and IronBrew1. Runs with your key don't count against your plan's monthly quota. IronBrew1 is the exception: it uses your plan quota first and switches to your own key once the quota is used up. Whether this is available depends on your plan (Own engine keys (BYOK) in Plans).
Kill-switch and versions
Access, versions & kill-switch on a script lets you:
- turn on Premium keys only — standard keys are refused when loading this script (
check_keyreturnsKEY_PREMIUM_REQUIRED); premium keys work as usual. The card shows a Premium only tag; - see its releases and Roll back to an earlier build, or unpin to serve the newest build;
- Disable this script — stops new downloads and launches. Players already running it are kicked on their next heartbeat (within a minute), and
check_keyreturnsSCRIPT_DISABLEDwith your message (default: "This script is temporarily disabled by its developer.").
Live sessions
Live sessions under the live audience chart lists the players running your scripts right now: Roblox user, game and place, executor, uptime and the last 15 minutes of heartbeats (sessions heartbeat every 20 seconds; Late means two in a row didn't arrive). Pick a script in the list, or use Live sessions in a script's menu, to see only that script. Click a row for its session, server (Job ID), place, HWID, key and Discord ID.
Actions on a session:
- Notify — shows your message as a Roblox notification on the player's next heartbeat. Scripts built before notifications existed don't show it: Re-obfuscate them. Sessions of very old loaders can only be ended.
- Join server — opens the player's game server in Roblox.
- Roblox profile — opens the player's profile.
- End session — stops the script on the next heartbeat and shows the player your reason. Optionally revokes the key too, so it can't be used again until you restore it in Keys.
Notify all and End all act on every session the list shows, with your search and filters applied. Viewers see the list; editors can notify and end sessions.
Loaders
A loader maps Roblox places to your protected scripts, so you share one loader line for all your games.
| Tab | What you set |
|---|---|
| General | Name, description, Enabled (disabled loaders stop serving scripts), Code before loading — Lua that runs before the routed script, e.g. to set globals. |
| Routes | Rules that match a Place or a Universe ID to a script. |
| Key & fallback | Key mode: No prompt (the key comes from script_key), Key window (a built-in themed prompt) or Custom (your own Lua). Fallback action when no route matches: Warn, Error, Kick or Script (run your own Lua), with an optional message. |
Use Copy loader on a loader card to get its line. Deleting a loader stops it from serving scripts immediately.