GET Public /api/v1/rpc/{codes}
/rpc is a trimmed-down /callbacks built for in-game use.
It returns only the Rich Presence activity lines per code — no Roblox
username, and none of the status messages (banned, paused, invalidated, not found,
"no activity detected"). Use it when the game just needs the raw RPC to render above heads.
/callbacks: pass one or more codes separated by &.
Each code still returns a {CODE; ... } block so multi-code responses stay parseable.
Plain English Flow
- Collect the
KibaCodefor every player currently in the server. - Join the codes with
&and callGET /api/v1/rpc/{codes}. - Kiba reads each linked Discord user's live activity and strips anything Roblox-related.
- Your game reads the activity lines inside each block and renders them.
Endpoint
GET https://api.kiba-is-a.top/api/v1/rpc/AB12&CD34&EF56
Response Format
One block per requested code. The block contains the code, then zero or more activity lines, then a closing brace. There is no username line and no status text.
Active User With Activity
{AB12;
Listening to Spotify,
Song Name Here,
Artist1, Artist2;
Playing,
Game Name Here;
}
No Activity, Or A Suppressed State
An empty block is returned for users with no current activity and for every
suppressed state (unknown code, banned, paused, or invalidated). The game cannot tell these
apart — by design, /rpc only ever exposes activity.
{AB12;
}
How It Differs From /callbacks
| /callbacks | /rpc | |
|---|---|---|
| Roblox username line | Yes | No |
| Status messages (banned / paused / not found) | Yes | No |
| Activity lines | Yes | Yes |
: vs ; error marker | Yes | No (always ;) |
| Suppressed users (banned/paused/invalidated) | Status block | Empty block |
Roblox Server Example
local HttpService = game:GetService("HttpService")
local Players = game:GetService("Players")
local RPC_BASE = "https://api.kiba-is-a.top/api/v1/rpc/"
local POLL_SECONDS = 10
local function collectPlayerCodes()
local codes = {}
for _, player in Players:GetPlayers() do
local code = player:GetAttribute("KibaCode")
if typeof(code) == "string" and string.match(code, "^[A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9]$") then
table.insert(codes, code)
end
end
return codes
end
local function parseRpc(responseText)
local result = {}
for block in string.gmatch(responseText, "{(.-)}") do
local code = string.match(block, "^([A-Z0-9][A-Z0-9][A-Z0-9][A-Z0-9])")
local lines = {}
for line in string.gmatch(block, "[^\n]+") do
if line ~= (code .. ";") then
table.insert(lines, line)
end
end
if code then result[code] = lines end
end
return result
end
while true do
local codes = collectPlayerCodes()
if #codes > 0 then
local url = RPC_BASE .. table.concat(codes, "&")
local ok, body = pcall(function() return HttpService:GetAsync(url) end)
if ok then
for code, lines in pairs(parseRpc(body)) do
-- Render `lines` above the matching player's head.
end
end
end
task.wait(POLL_SECONDS)
end
Out-of-Game Test
curl "https://api.kiba-is-a.top/api/v1/rpc/AB12&CD34"
Activity Filtering
Like /callbacks, Kiba removes any Discord activity containing Roblox in
its name, details, state, or asset text so the game is not echoed back into the display.
Rate Limit
GET /rpc/* is limited to 100 requests per 10 seconds per IP.
Poll once per server tick for all players, not once per player.
Status Codes
| HTTP | Meaning |
|---|---|
200 | Request accepted. Empty blocks are normal. |
400 | No usable code path was provided. |
429 | Polling too often. |