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.

Same request shape as /callbacks: pass one or more codes separated by &. Each code still returns a {CODE; ... } block so multi-code responses stay parseable.

Plain English Flow

  1. Collect the KibaCode for every player currently in the server.
  2. Join the codes with & and call GET /api/v1/rpc/{codes}.
  3. Kiba reads each linked Discord user's live activity and strips anything Roblox-related.
  4. 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 lineYesNo
Status messages (banned / paused / not found)YesNo
Activity linesYesYes
: vs ; error markerYesNo (always ;)
Suppressed users (banned/paused/invalidated)Status blockEmpty 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

HTTPMeaning
200Request accepted. Empty blocks are normal.
400No usable code path was provided.
429Polling too often.