A public JSON API for third-party loaders and GUIs. Completely free — no paid tiers, no subscription limits. You build the interface — auth, keys, payments and script storage stay on GrieferHub.
All endpoints answer JSON (except /script — it returns code). GET works everywhere, including game:HttpGet in Roblox. POST accepts a JSON or form body with the same parameters.
Your GUI is just a shell: it asks the GrieferHub server whether the player may run the script, shows the key link, then downloads and runs the script. The whole scheme: your GUI → /checkkey → /script → the script runs. You never store keys or code — everything stays on GrieferHub.
| What | Description |
|---|---|
pid | Script ID from its page link: /script?pid=ab12cd34 → pid = ab12cd34. |
hwid | The player's Roblox UserId: tostring(Players.LocalPlayer.UserId). One account = one hwid. |
key | The KEY-... string the player received after passing your key system checkpoints. |
token | Optional. Create it on your profile (⚙ API tab): higher rate limit + call log. |
Call /api/v1/getkey?pid=... — it returns the key-system link. Show it in your GUI or copy it to the clipboard.
After passing the checkpoints the player receives a KEY-... string and types it into your GUI.
Status "valid" → load the script via /script. Any error → just show the message field — it is already human-readable.
Every few minutes. Feeds the online counters and blocks one key being used on two devices at the same time.
A complete minimal loader built with our GHUI window library + the API. Replace DOMAIN and PID — that is all.
-- 1) our window library local HttpService = game:GetService("HttpService") local API = "https://secret.griefer.world/api/v1" local PID = "ab12cd34" -- pid вашего скрипта local HWID = tostring(game.Players.LocalPlayer.UserId) local function getJSON(url) local ok, res = pcall(function() return game:HttpGet(url) end) if not ok then return nil end local ok2, data = pcall(function() return HttpService:JSONDecode(res) end) return ok2 and data or nil end local UI = loadstring(game:HttpGet("https://secret.griefer.world/library/raw/ghui"))() local Window = UI:CreateWindow({ Title = "My Loader" }) local Tab = Window:CreateTab("Key") local KeyInput = Tab:CreateInput({ Title = "Your key", Placeholder = "KEY-..." }) -- 2) the key-system link, copied to clipboard Tab:CreateButton({ Title = "Get Key (copy link)", Callback = function() local info = getJSON(API .. "/getkey?pid=" .. PID) if info and info.key_link and setclipboard then setclipboard(info.key_link) end end, }) -- 3) check the key and load the script Tab:CreateButton({ Title = "Check & Load", Callback = function() local q = "?pid=" .. PID .. "&hwid=" .. HWID .. "&key=" .. KeyInput:Get() local data = getJSON(API .. "/checkkey" .. q) if data and data.success and data.status == "valid" then local code = game:HttpGet(API .. "/script" .. q) loadstring(code)() end end, }) -- heartbeat every 3 minutes while the script runs task.spawn(function() while true do task.wait(180) getJSON(API .. "/heartbeat?pid=" .. PID .. "&hwid=" .. HWID .. "&key=" .. KeyInput:Get()) end end)
You do not have to upload a script just to get a pid. Create a project in your profile — the pid and the key system work instantly. Integrate your GUI with the API, then upload the Lua code whenever you are ready: it is stored and served by GrieferHub, /script hands it out after a key check exactly like for regular uploads.
Profile → "Create Project". Name it, add your Linkvertise links (optional) — the pid appears right away.
Same as for uploaded scripts: /getkey → the player passes checkpoints → /checkkey → /heartbeat.
Edit → paste the Lua code. It lives on GrieferHub; until then /script answers no_code. Public projects go through admin approval.
After approval the script appears in the catalog and /script serves the code after a valid key check. No external hosting is involved at any step.
Created on your profile (⚙ API tab). Pass it as the X-API-Token: gh_live_... header or the &token=gh_live_... parameter. Without a token — 60 requests/min per IP, with a token — 300/min, plus every call is logged in your profile. A revoked or unknown token → 401.
| Parameter | Description |
|---|---|
key_required | The script uses the key system — the player needs a key. Show the /getkey link. |
invalid_key | Wrong key, or it was issued to a different Roblox account |
expired_key | Key expired — the player needs a new one |
not_whitelisted | Private script: this player is not in the whitelist |
pending | The script is not approved yet |
no_code | The project exists, but the author has not uploaded the code yet. Upload it via Edit on your profile. |
rate_limited | Too many requests — wait a minute |
api_disabled | The API is turned off by the administration |
Public script metadata (no auth): name, author, key requirement, price, online count.
| Parameter | Required | Description |
|---|---|---|
pid | yes | Script ID |
{
"success": true, "status": "ok",
"script": { "pid": "ab12cd34", "name": "My Script", "use_key": true,
"price": 0, "visibility": "public", "online": 3,
"updated_at": 1725000000.0, "author_id": "123..." }
}
Key-system link for the "Get Key" button in your GUI.
| Parameter | Required | Description |
|---|---|---|
pid | yes | Script ID |
{
"success": true, "status": "ok",
"key_link": "https://link-center.net/...",
"key_url": "https://secret.griefer.world/get-key?pid=ab12cd34"
}
Possible statuses: no_key_system (keys off for this script).
The core call for third-party GUIs: is this hwid allowed to run the script with this key? Respects private scripts (whitelist). The response is signed with an HMAC.
| Parameter | Required | Description |
|---|---|---|
pid | yes | Script ID |
hwid | yes | Roblox UserId of the player |
key | if the key system is enabled | Player's key |
{
"success": true, "status": "valid", "message": "Key is valid",
"expires_at": 1725086400.0, -- unix time the key expires (or null)
"expires_in": 86400, -- seconds until expiry
"online": 3, -- players in game right now (via heartbeat)
"script_version": 1725000000, -- unix time of the last script update
"sig": "0af31c..." -- HMAC-SHA256(secret, "pid:hwid:expires_at"), first 32 chars
}
The script code itself — the same obfuscated payload the built-in loader receives. Success — text/plain with Lua code, error — JSON. Every unique hwid counts one load per 24 hours.
| Parameter | Required | Description |
|---|---|---|
pid / hwid / key | same as /checkkey | Full authorization required |
A "script is alive" ping every few minutes while it runs. Anti key-sharing: one key can be live on one device at a time — a second device gets key_in_use (403) while the first one stays silent for over 30 minutes. Returns the online player count.
| Parameter | Required | Description |
|---|---|---|
pid / hwid / key | same as /checkkey | Full authorization required |
{
"success": true, "status": "ok",
"session": "same", -- new | same | took_over
"online": 3,
"expires_in": 86400,
"sig": "0af31c..."
}
Crash/error report from your GUI — lands in the GrieferHub admin panel.
| Parameter | Required | Description |
|---|---|---|
pid | yes | Script ID |
message | yes | Error text (up to 2000 characters) |
hwid | optional | Who sent the report |
kind | optional | Type: crash / error / feedback |
Responses of /checkkey and /heartbeat contain a sig field = the first 32 chars of HMAC-SHA256 over the string "pid:hwid:expires_at" keyed with the project secret. The secret is shown to the author on the script edit page ("Developer API secret" block). This lets your GUI verify the answer really came from the GrieferHub server and was not spoofed.
-- Lua (executors with crypt): local expected = crypt.hmac.crypt(crypt.base64encode("pid:hwid:" .. tostring(expires_at)), secret) -- compare the first 32 chars with the data.sig field
Where do I find my pid?
Open your script page in the catalog. The link looks like /script?pid=ab12cd34 — ab12cd34 is your pid.
Do I have to use the key system?
If the key system is switched off for the script, /checkkey works without the key parameter — just pass hwid.
What is the token for?
It is optional. Without it — 60 requests/min per IP; with it — 300/min and a call log in your profile. Create it in the ⚙ API tab of your profile.
checkkey says invalid_key but the key looks correct
A key is bound to the Roblox account (hwid) that received it. A different account = invalid_key by design — that is what stops key sharing.
Can I start using the API before uploading my script?
Yes — use "Create Project" in your profile. You get a pid instantly and the whole /api/v1 key flow works. The Lua code is uploaded to GrieferHub afterwards (Edit page) and is served by /script like any other script.
• The API is completely free — paid tiers and paid tokens do not exist.
• Without a token — 60 requests/min per IP, with a token — 300/min per token (429 when exceeded).
• Keys, purchases and access fully mirror the built-in loader rules — the API has no separate logic.
• A token is not your account password: it only identifies your requests. Do not publish it.
• For your GUI take a ready-made library from the GUI Library — our GHUI SDK gives you CreateWindow, tabs and buttons in one line.
• The administration may disable the API entirely — then all endpoints answer 503 api_disabled.
• Questions and extended limits — the GrieferHub Discord community.