Documentation

← Panda Auth

For Developers · Libraries

V3 External Library

The V3 library without VSS. Loaded directly via loadstring from a Panda-hosted URL — no tokens consumed, no tier limits, no obfuscation work on your end. Same Pelinda API surface as VSS-served V3, but the caller must pass Service explicitly since there's no auto-injection.

When to use this vs VSS-served V3

  • Use External when you're out of Panda Tokens, your tier doesn't include enough VSS quota, or you want to host the same loader on every script without re-uploading.
  • Use VSS-served V3 when you want per-script customization, a unique loader per upload, or your tier covers the token cost comfortably.

The loadstring URL

The external V3 library lives at a stable public URL. Hit it with game:HttpGet + loadstring:

loadstring(game:HttpGet("https://api.pandauth.com/lib/external/v3.lua"))()

The URL is cached for an hour at our edge so loads are fast. When we update the library (admin re-saves it in the dashboard), the same URL transparently serves the new build — your end users never need to update anything.

Minimal example

The shortest possible working script. Replace "your-service-id" with your service's identifier from the Hub Details tab.

-- Load the external V3 library
local Pelinda = loadstring(game:HttpGet("https://api.pandauth.com/lib/external/v3.lua"))()

-- Validate
local result = Pelinda.Init({
    Service    = "your-service-id",  -- REQUIRED — no auto-inject like VSS
    Key        = "PANDA-XXXX-XXXX",
    SilentMode = false,
})

if result == "validated!!" then
    print("Authenticated. Premium:", __PELINDA_IS_PREMIUM__)
    -- your script logic here
elseif result == "error!!" then
    warn("Connection error")
else
    -- "invalid!!"
    local link = Pelinda.GetKeyLink({ Service = "your-service-id" })
    setclipboard(link)
end

Service is REQUIRED

Unlike VSS-served V3 (which auto-injects Client_ServiceID), the External build has no service context. You MUST pass Service in every Pelinda.Init and Pelinda.GetKeyLink call. Omitting it returns "error!!" with a console message telling you to add it.

Pelinda API reference

The Pelinda API is identical to the VSS-served V3 build — same parameter names, same return values, same globals set on success. The only difference is that Service is required.

Pelinda.Init({ ... })

  • Service (string, required) — your service identifier.
  • Key (string, required unless keyless) — the user's license key.
  • SilentMode (boolean, default false) — suppress validation prints.
  • SecurityLevel (number, default 1) — leave at 1 unless you have a specific reason.

Returns one of:

  • "validated!!" — success. Globals listed below are populated.
  • "invalid!!" — the key is wrong / expired / HWID-mismatched.
  • "error!!" — network or config error (missing service, no internet, etc.).

Returns the URL the user visits to get a key. Same auto-HWID handling as VSS — the user's HWID is appended to the URL for you. Returns nil if Service is missing.

Globals populated on validation

  • __PELINDA_IS_PREMIUM__ — boolean.
  • __PELINDA_IS_KEYLESS__ — boolean (true for keyless mode validations).
  • __PELINDA_KEY_EXPIRES_AT__ — ISO string or nil for non-expiring keys.
  • __PELINDA_KEY_HWID__ — the HWID the key got bound to.

Save-and-resume pattern

Most scripts want the user to enter their key once, then validate silently on every subsequent run. The standard pattern uses isfile / readfile / writefile guarded by pcall:

-- Pattern: try saved key first, fall back to UI
local function trySaved()
    if not isfile or not isfile("panda_key.txt") then return false end
    local key = readfile("panda_key.txt")
    local result = Pelinda.Init({
        Service = "your-service-id", Key = key, SilentMode = true,
    })
    return result == "validated!!"
end

if not trySaved() then
    -- show your key entry UI here
end

Low-UNC compatibility

Always guard executor-specific functions — isfile, readfile, writefile, setclipboard — with pcall or a typeof(fn) == "function" check. Low-UNC mobile executors may not implement them, and the script should degrade gracefully instead of crashing.

We ship 45 visually distinct GUI templates you can use as a starting point — a mix of dark and light themes, all compatible with every executor including low-UNC mobile ones. Each template has an Advanced Settings form so you can customize SilentMode, SaveKey, HubName, kick behavior, and other knobs before downloading. Lucide icons are wired in via sprite-sheet, so the buttons and discs show real icons in-game — not emojis.

Layout vocabulary covers centered modals, top/bottom toasts, side drawers, bottom sheets, full-screen splashes, floating bubbles, a 4-segment OTP-style pin, an auto-validate spinner, and a Material Design 3 extended FAB. Pick by feel — the auth flow is identical across all 45.

Open the Template Gallery

Common pitfalls

  • Forgetting the Service param. Single most common error. The library will print a helpful message but the silent-mode path will just silently fail.
  • Using setclipboard / writefile unguarded. Crashes on low-UNC executors. Wrap with pcall or a function-typeof check.
  • Hard-coding test keys in shipped scripts. Anyone reading your script gets a free trial. Always require the user to enter their own.
  • Skipping retries. Network blips happen. The ship templates retry 3× by default — keep it.