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.

On this page

Scripts

Obfuscation (sidebar → Access) has two tabs: Scripts and Loaders.

A new script goes through three steps:

  1. Source — drop a .lua, .luau or .txt file or paste the code (up to 10 MB), and set the output file name.
  2. Obfuscator — choose how the script is protected (see Obfuscators).
  3. Configure — the engine's preset or options.

The whitelist is always embedded, and you get a loader URL:

lua
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

ObfuscatorOptionsCost
SantiAuthMedium (smaller and faster) or Strong (more scrambling, larger build) presetBuilt in, no API key needed
LuraphTarget runtime, optimization level, VM structure, compression and morePlan quota or your own API key
wYnfuscateSecurity tier, target platform, node, source optimizationsRequires your own API key
IronBrew1Platform, anti-tamper, VM compression, scramblingPlan 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_key returns KEY_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_key returns SCRIPT_DISABLED with 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.

TabWhat you set
GeneralName, description, Enabled (disabled loaders stop serving scripts), Code before loading — Lua that runs before the routed script, e.g. to set globals.
RoutesRules that match a Place or a Universe ID to a script.
Key & fallbackKey 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.