Sign in

Logs panel

Configure the public staff-log surface served at /logs/<your-project-key>.

Updated May 2, 2026

Logs panel

The logs panel lives at unbbound.com/logs/<your-project-key> and is the dashboard your staff visits to read game-server events.

Authentication uses your own Discord application — Unbbound never sees your staff's tokens.

Setup wizard

The wizard is six guided steps:

  1. Application — create a Discord app on the developer portal.
  2. Client — paste Client ID + Client Secret.
  3. Bot — paste the bot token (revealed once via Reset Token).
  4. Redirect URL — copy the URL we display and paste it under OAuth2 → Redirects.
  5. Invite — invite the bot to your Discord server with bot scope and Administrator permission.
  6. Server — paste the Discord server ID. We then run the verification, and any failed check jumps you back to the relevant step.

Allowed roles

Once verification passes, Unbbound fetches every role on your Discord server. Tick the ones that should see the panel — the rest of your community gets a friendly "you're not part of staff" page.

Public URL

The slug is derived from your project identifier (set during the onboarding wizard). To rename it, change the project key first.

Emitting a log line

From any server-side script, push events through the Unbbound logs API. The agent batches calls and POSTs every 2 seconds:

lua
local Unbbound = exports['unbbound']

RegisterNetEvent('shop:purchase', function(itemId, price)
  local src = source
  local player = ESX.GetPlayerFromId(src)

  Unbbound:log({
    script   = 'shop',
    author   = player.getName(),
    uniqueId = player.identifier,
    message  = ('Bought %sx %s for $%d'):format(1, itemId, price),
    metadata = { itemId = itemId, price = price },
  })
end)

Each call shows up under /logs/<your-slug> in real time. Filtering on script, author or uniqueId is server-side, so even a million-row history stays snappy.

js
// Or from a JS-bundled script (txAdmin, monitors, etc.)
const res = await fetch(`https://api.unbbound.com/log-panel/${slug}/ingest`, {
  method: "POST",
  headers: {
    "content-type": "application/json",
    "x-unbbound-token": INGEST_TOKEN,
  },
  body: JSON.stringify({
    script: "monitor",
    author: "system",
    uniqueId: "node-1",
    message: "Server warmup complete",
  }),
});