POST Auth Required /api/v1/log/{category}

Log lets trusted Roblox servers send important events to Kiba. Kiba routes each event to the matching log, and moderation events can also be stored as user infractions.

This endpoint requires the bearer token. Only call it from server-side code — never put the API key in a LocalScript or public module.

General Flow

  1. Your game detects an event, a validation issue, or a moderation action.
  2. The Roblox ServerScript sends a JSON payload to /api/v1/log/{category}.
  3. {category} is one of server, ingame, or moderation.
  4. Kiba routes the event to that category's log and replies with a small JSON confirmation.

Endpoint & Body

All three categories share the same request shape — only {category} in the path changes.

POST https://api.kiba-is-a.top/api/v1/log/{category}
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{
    "event_type": "warning",
    "roblox_username": "PlayerName",
    "roblox_user_id": 12345678,
    "description": "Exploit behavior detected by AntiCheat",
    "issued_by": "AntiCheat",
    "code": "AB12"
}
FieldRequiredMeaning
event_typeYesShort event label, such as boot, warning, player_join, or callback_error.
descriptionYesHuman-readable explanation of what happened.
roblox_usernameNoAffected player's username, usually player.Name.
roblox_user_idNoAffected player's Roblox user ID, usually player.UserId.
issued_byNoSource of the event: staff name, system name, or script name.
codeNoPlayer's 4-character Kiba code. Include it when the event should attach to the linked user.

A small helper keeps every call consistent across the three categories:

local HttpService = game:GetService("HttpService")

local API_KEY = "YOUR_API_KEY"
local LOG_BASE = "https://api.kiba-is-a.top/api/v1/log/"

local function sendKibaLog(category, payload)
    local ok, response = pcall(function()
        return HttpService:RequestAsync({
            Url = LOG_BASE .. category,
            Method = "POST",
            Headers = {
                ["Authorization"] = "Bearer " .. API_KEY,
                ["Content-Type"] = "application/json"
            },
            Body = HttpService:JSONEncode(payload)
        })
    end)

    if not ok then
        warn("Kiba log request failed: " .. tostring(response))
        return false
    end
    if not response.Success then
        warn("Kiba log rejected: " .. tostring(response.StatusCode) .. " " .. response.Body)
        return false
    end
    return true
end

The three categories below are independent logs — each goes to its own destination, which the owner sets up. You can use one, two, or all three. Every entry is labeled so the logs are easy to tell apart.

1. Server Log Server Activity

Records what happens inside the Discord server. Kiba writes most of this automatically — message edits, message deletes, bulk deletes, and member join / leave / ban / unban — across every channel of each whitelisted server. A server is only logged once the owner has whitelisted it; other servers the bot is in are skipped. (Message text appears only when the Message Content intent is enabled.) You can also post your own backend status here.

Call

sendKibaLog("server", {
    event_type = "boot",
    description = "Roblox server started",
    issued_by = game.JobId
})

2. In-Game Log In-Game / Threats

Records in-game player activity and safety detections. The /safety endpoint writes here on its own whenever a TASE/Rotector check flags a user as unsafe or review (shown as Threat Detection). Report player enter/leave here as well, since Kiba can't see Roblox join/leave by itself. If the in-game log isn't set up, safety detections fall back to the moderation log.

Calls

-- Validation / non-staff event
sendKibaLog("ingame", {
    event_type = "callback_parse_error",
    description = "Callback response could not be parsed",
    issued_by = "PresencePoller"
})

-- Player enter / leave
game.Players.PlayerAdded:Connect(function(player)
    sendKibaLog("ingame", {
        event_type = "player_join",
        roblox_username = player.Name,
        roblox_user_id = player.UserId,
        description = player.Name .. " entered the game"
    })
end)

game.Players.PlayerRemoving:Connect(function(player)
    sendKibaLog("ingame", {
        event_type = "player_leave",
        roblox_username = player.Name,
        roblox_user_id = player.UserId,
        description = player.Name .. " left the game"
    })
end)

3. Moderation Log Admin Report

Records internal moderation — staff or automated enforcement actions. This log is populated only by what you POST to /log/moderation. When a valid code is included, the event is also stored as a user infraction, visible in /info.

Call

local function reportModeration(player, action, description, issuedBy)
    sendKibaLog("moderation", {
        event_type = action,
        roblox_username = player.Name,
        roblox_user_id = player.UserId,
        description = description,
        issued_by = issuedBy or "Server",
        code = player:GetAttribute("KibaCode")
    })
end

reportModeration(player, "warning", "Exploit behavior detected", "AntiCheat")

Out-of-Game Test

curl -X POST https://api.kiba-is-a.top/api/v1/log/moderation \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"event_type":"warning","roblox_username":"PlayerName","roblox_user_id":12345678,"description":"Exploit behavior detected","issued_by":"AntiCheat","code":"AB12"}'

Success Response

{
    "status": "logged",
    "category": "moderation"
}

Errors

HTTPCauseFix
400Unknown category or invalid code.Use server, ingame, or moderation; send 4-character codes only.
401Missing or invalid bearer token.Check the server-side API key.
422Payload validation failed.Include event_type and description; keep roblox_user_id positive.
429Rate limit exceeded.Batch noisy events or slow down repeated reports.

Rate Limit

POST /log/* allows 30 requests per minute per IP.