Keys & players

Discord bot

A member panel in your server — players get keys, redeem, fetch the script and reset their HWID themselves.

On this page

Connecting a server

  1. Open Discord Bot (sidebar → Integrations) and add the SantiAuth bot to your server.
  2. Pick the server in the list to bind it to the service.
  3. Post a panel in a channel (see below).

Each connected server has its own sections: Overview, Panels, Roles, Rewards, Notifications and Activity.

Member panel

A panel is a message with buttons. Every button works for the player who presses it — replies are private.

ButtonWhat the player gets
Get KeyTheir personal key-page link — or their current key if they already have one.
Redeem KeyA form to paste a key. The key is linked to their Discord account (SA_LinkedDiscordID) and roles are synced.
Get ScriptThe loader snippet you set on the panel.
MobileA separate reply for phone players, e.g. a copy-friendly loader.
Get RoleSyncs their Discord role with their key (Standard / Premium).
Reset HWIDLets them pick a bound device and unbind it — no ticket needed.
Get StatsKey status, type and expiry.
Pay with RobuxBuy a key with Robux through your Robux shop. Off by default — turn it on per panel.

You can hide any button, rename it, change its emoji and color, and add custom buttons. Each button can be open to everyone, to key holders only or to Premium key holders only (in keyless mode key-holder buttons open to everyone).

Slash commands

Members:

text
/key info         — status, expiry and devices of your key
/key redeem       — link a license key to your Discord account
/key reset-hwid   — unbind your key from its device
/script           — get the script for this service
/invites          — your invite count and the next invite reward
/boost status     — your booster rewards and when the next one unlocks
/boost claim      — collect unlocked booster rewards

Service admins (/admin):

CommandWhat it does
/admin key createCreate up to 10 keys: minutes (empty = lifetime), premium, name.
/admin key list / infoKeys of a user or the latest keys; details of one key.
/admin key extendAdd minutes to a key.
/admin key revoke / unrevokeBlock or unblock a key.
/admin key reset-hwid / deleteUnbind a key's device; delete a key (asks to confirm).
/admin user ban / unban / bansBan a Discord user (optionally for N minutes), lift a ban, list active bans.
/admin infoService overview: keys, providers, bans, panel state.
/admin statsStatistics for 7 or 30 days.
/admin maintenanceTurn the panel's maintenance mode on or off.

Custom messages

Every reply can be rewritten in Panels (panel → Responses). Use placeholders between percent signs, e.g. %key% (write %% for a literal %):

PlaceholderValue
%discord_mention%, %discord_username%, %user_name%, %discord_user_id%The player.
%key%, %key_masked%Their key, full or masked.
%key_type%, %is_premium%, %key_status%, %expires_at%, %created_at%, %last_used_at%, %executions%Key details.
%key_url%Their personal key-page link (signed for this member).
%script%The panel's loader snippet.
%resets_left%, %next_reset_at%, %devices_count%, %hwid_reset_status%HWID reset details.
%redeem_result%, %role_name%, %role_assigned%, %cooldown%Results of Redeem, Get Role and cooldowns.
%service_name%, %service_slug%, %provider_name%, %panel_name%Your service, provider and panel.
%date%, %time%Current date and time.

Unknown placeholders are flagged when you save.

For example, a Get Script reply (inside a lua code block) that hands out a ready-to-run loader:

lua
script_key = "%key%"
%script%

Roles

Set a Basic access role (given for any active key) and a Premium access role (for Premium keys, on top of Basic). With Grant automatically on Redeem on, roles are granted on Redeem and Get Role; otherwise players only get their key linked.

Rewards

  • Invite rewards — hand out a key or a role when a member reaches a number of verified invites. Anti-abuse rules ignore bots, self-invites and rejoins, can subtract leavers, and can require a role, a minimum account age and a hold period.
  • Booster rewards — reward members who boost your server. Boosters check and collect rewards with the slash commands:
text
/boost status   — see your rewards and when the next one unlocks
/boost claim    — collect unlocked rewards

Notifications and activity

Notifications posts public announcements (e.g. a thank-you for boosts) and a private staff log to channels you choose. Activity lists every panel action — who pressed what and whether it worked.

Discord webhooks from your script

Posting to a Discord webhook straight from Lua leaks its URL — anyone can dump it and spam your channel. Instead, create a relay in Webhooks → Discord notifications: SantiAuth stores the real Discord URL and gives you a public dispatch URL with a Rate limit — max messages per caller IP each minute (0 = no throttling).

lua
local HttpService = game:GetService("HttpService")

request({
    Url = "https://api.santiauth.com/api/v1/discord-webhooks/<dispatch-id>/dispatch",
    Method = "POST",
    Headers = { ["Content-Type"] = "application/json" },
    Body = HttpService:JSONEncode({
        values = { roblox_username = game.Players.LocalPlayer.Name, place_id = tostring(game.PlaceId) },
    }),
})

The embed is designed in the dashboard; {placeholders} in curly braces are filled from values — key, script_name, provider_name, service_name, hwid, place_id, roblox_username, roblox_job_id, roblox_universe_id, executor, timestamp and more. Unknown placeholders stay as typed so you can spot typos. Over the limit extra events are dropped.