API Reference
v1Check votes, post stats, and receive real-time vote webhooks in your bot.
Base URL:
https://lamunix.com/api/v11,000 req / hr🔒
Authentication Required All endpoints (except the widget badge) require
Authorization: Bearer bl_your_key. Generate a key from your Dashboard. Keys can be revoked at any time. Max 5 keys per account. Parameters
idpathintegerreqLamunix numeric bot IDResponse fields
idintegerLamunix internal IDdiscordIdstringDiscord application snowflake IDnamestringBot display nameshortDescriptionstringOne-line descriptiontagsstring[]Category tagsvotesintegerAll-time vote countmonthlyVotesintegerVotes this month (resets 1st)certifiedbooleanLamunix certified statuspremiumbooleanPremium statusExample
{
"id": 42,
"discordId": "1234567890",
"name": "My Awesome Bot",
"shortDescription": "The best bot ever made",
"tags": ["music", "fun"],
"votes": 1337,
"monthlyVotes": 42,
"certified": false,
"premium": false
}401Unauthorized — missing or invalid API key404Bot not found or not approved Votes last 12 hours. On Sat & Sun votes count 2× automatically.
Parameters
idpathintegerreqLamunix numeric bot IDuserIdquerystringreqDiscord user snowflake ID to checkExample
{
"voted": true,
"votedAt": "2026-03-06T14:22:00.000Z"
}401Unauthorized404Bot not foundRequest body
guildCountbodyintegerreqTotal guild (server) countshardCountbodyinteger—Shard count (optional)Example
POST /api/v1/bots/42/stats
Authorization: Bearer bl_your_api_key_here
Content-Type: application/json
{
"guildCount": 15000,
"shardCount": 4
}200{ "ok": true }401Unauthorized403Forbidden — you do not own this bot Badges are cached for 5 minutes. No API key required.
Parameters
idpathintegerreqLamunix numeric bot IDstylequerystring—compact for flat badge; omit for cardExample
<!-- Compact flat badge --> <img src="https://lamunix.com/api/bots/42/widget.svg?style=compact" alt="My Bot" /> <!-- Full card (default) --> <img src="https://lamunix.com/api/bots/42/widget.svg" alt="My Bot" />
Configure your URL in Dashboard → Settings → Webhook. Lamunix POSTs on every vote. Respond 2xx within 5 seconds.
Payload fields
botIdstringDiscord bot snowflake IDuserIdstringDiscord user snowflake IDtype"upvote"Event typeisWeekendbooleantrue on Sat/Sun — votes count 2xvotedAtstringISO 8601 vote timestampExample payload
{
"botId": "1234567890",
"userId": "9876543210",
"type": "upvote",
"isWeekend": false,
"votedAt": "2026-03-06T14:22:00.000Z"
}Signature verification (Node.js / TS)
Every delivery includes X-BotList-Signature — HMAC-SHA256 of the raw body. Always verify before processing.
import { createHmac, timingSafeEqual } from 'crypto'
function verify(rawBody: string, sig: string, secret: string) {
const expected = createHmac('sha256', secret)
.update(rawBody).digest('hex')
const a = Buffer.from(sig)
const b = Buffer.from(expected)
return a.length === b.length && timingSafeEqual(a, b)
} The raw key value is never returned after initial creation.
200Array of API key objects401Not authenticated The plain-text key is returned once only — store it immediately. Maximum 5 keys per account.
201Key created — contains the one-time plaintext value403Key limit reached (max 5)Parameters
keyIdpathstringreqID of the key to revoke200Key revoked successfully404Key not found Authenticate with
Authorization: Bridge blst_bridge_<key>. Bridge keys are per-bot and separate from your personal API key. Request body
onlinebodybooleanreqWhether the bot process is currently onlinepingMsbodyinteger—WebSocket ping latency in msguildCountbodyinteger—Number of guilds — also synced to bot profileshardCountbodyinteger—Number of active shards — also synced to bot profilememoryMbbodyinteger—Current RSS memory in megabytescpuPercentbodyinteger—CPU utilisation 0–100uptimeSecondsbodyinteger—Seconds since bot process last startederrorsLastHourbodyinteger—Unhandled errors in the rolling last 60 minlastCrashAtbodystring—ISO 8601 timestamp of last crash, or nullExample
POST /api/bridge/heartbeat
Authorization: Bridge blst_bridge_your_key_here
Content-Type: application/json
{
"online": true,
"pingMs": 42,
"guildCount": 15000,
"shardCount": 4,
"memoryMb": 312,
"cpuPercent": 18,
"uptimeSeconds": 86400,
"errorsLastHour": 0
}200{ "ok": true }401Missing or invalid Bridge key Errors are surfaced in your bot's dashboard. Uses the same Bridge key auth.
Request body
messagebodystringreqError message — max 2,000 charsstackbodystring—Full stack trace — max 10,000 charsExample
POST /api/bridge/error
Authorization: Bridge blst_bridge_your_key_here
Content-Type: application/json
{
"message": "UnhandledPromiseRejection: TypeError: Cannot read properties of undefined",
"stack": "TypeError: Cannot read properties of undefined\n at Client.<anonymous> (src/events/messageCreate.js:14:22)"
}200{ "ok": true }401Missing or invalid Bridge key Requires session auth (cookie). Returns only tickets belonging to you.
Response fields
idbodyinteger—Ticket IDsubjectbodystring—Ticket subject linecategorybodystring—Auto-routed category (e.g. "bot-issue", "billing")prioritybodystring—low | normal | high | urgentstatusbodystring—open | in_progress | resolved | closedupdatedAtbodystring—ISO 8601 timestamp of last activity200Array of ticket objects401Not authenticated Tickets are auto-categorised and prioritised. Supply a
botId to attach live diagnostics for staff context. Request body
subjectbodystringreqTicket subject — 5 to 200 charsbodybodystringreqDetailed description — 10 to 4000 charsbotIdbodyinteger—Lamunix bot ID — triggers bot diagnosticsExample request
POST /api/support/tickets
Content-Type: application/json
{
"subject": "Bot votes not counted after voting",
"body": "Since yesterday votes go through on the site but the count on my bot profile isn't updating. Bot ID is 42.",
"botId": 42
}Example response
{
"id": 17,
"category": "bot-issue",
"priority": "high",
"routing": {
"team": "bot-support",
"confidence": 0.91,
"keywords": ["votes", "not updating"]
}
}201Ticket created — returns id, category, priority, and routing info400Validation error — subject or body out of bounds401Not authenticated200{ ticket, messages: [{ id, content, isStaff, isSystem, createdAt, sender? }] }403Ticket belongs to another user404Ticket not found Replying to a
resolved ticket will automatically reopen it. Request body
contentbodystringreqMessage content — 1 to 4000 chars201Message created — returns the new message object400Content too short or too long403Ticket belongs to another user or is closed400Bad RequestMissing or invalid parameters401UnauthorizedMissing, invalid, or revoked API key403ForbiddenYou do not own the requested resource404Not FoundResource does not exist or is not approved429Too Many RequestsRate limit exceeded — 1,000 req/hr500Server ErrorUnexpected internal errorError shape
{
"statusCode": 401,
"message": "Missing API key"
}