BotsList.net
1.0.0OAS 1.0Use the BotsList API to check votes, retrieve bot info, post stats, and receive real-time vote webhooks in your Discord bot.
Base URL
https://botslist.net/api/v1π
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. Maximum 5 keys per account.
Parameters
NameInTypeRequiredDescription
idpathintegertrueBotsList numeric bot IDResponses
idintegerBotsList internal IDdiscordIdstringDiscord application snowflake IDnamestringBot display nameshortDescriptionstringOne-line descriptiontagsstring[]Category tagsvotesintegerAll-time vote countmonthlyVotesintegerVotes this month (resets 1st)certifiedbooleanBotsList certified statuspremiumbooleanPremium statusExample Value
{
"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 key
404Bot not found or not approved
π‘ Votes last 12 hours. On Sat & Sun votes count 2Γ automatically.
Parameters
NameInTypeRequiredDescription
idpathintegertrueBotsList numeric bot IDuserIdquerystringtrueDiscord user snowflake ID to checkResponses
votedbooleantrue if voted in the last 12 hoursvotedAtstring | nullISO 8601 timestamp of last vote, or nullExample Value
{
"voted": true,
"votedAt": "2026-03-06T14:22:00.000Z"
}401Unauthorized
404Bot not found
Parameters
NameInTypeRequiredDescription
idpathintegertrueBotsList numeric bot IDRequest Body Β· application/json
FieldInTypeRequiredDescription
guildCountbodyintegertrueTotal guild (server) countshardCountbodyintegerfalseShard count (optional)POST /api/v1/bots/42/stats
Authorization: Bearer bl_your_api_key_here
Content-Type: application/json
{
"guildCount": 15000,
"shardCount": 4
}Responses
{ "ok": true }401Unauthorized
403Forbidden β you do not own this bot
π Badges are cached for 5 minutes. No API key required.
Parameters
NameInTypeRequiredDescription
idpathintegertrueBotsList numeric bot IDstylequerystringfalsecompact for flat single-line badge; omit for cardResponses
<!-- Compact flat badge --> <img src="https://botslist.net/api/bots/42/widget.svg?style=compact" alt="My Bot" /> <!-- Full card (default) --> <img src="https://botslist.net/api/bots/42/widget.svg" alt="My Bot" />
Configure your URL in Dashboard β Settings β Webhook. BotsList POSTs on every vote. Respond 2xx within 5 seconds.
Payload Fields
FieldInTypeRequiredDescription
botIdbodystringtrueDiscord bot snowflake IDuserIdbodystringtrueDiscord user snowflake IDtypebody"upvote"trueEvent typeisWeekendbodybooleantruetrue on Sat/Sun β votes count 2xvotedAtbodystringtrueISO 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)
}Returns all keys for your account. The raw key value is never returned after initial creation.
Responses
200Array of API key objects
401Not authenticated
The plain-text key is returned once only β store it immediately. Maximum 5 keys per account.
Responses
201Key created β contains the one-time plaintext value
403Key limit reached (max 5)
Parameters
NameInTypeRequiredDescription
keyIdpathstringtrueID of the key to revokeResponses
200Key revoked successfully
404Key not found
Authenticate with your bot's Bridge key:
Authorization: Bridge blst_bridge_<key>. Bridge keys are per-bot and are created from your bot's dashboard. This is separate from your personal API key.Request Body
NameInTypeRequiredDescription
onlinebodybooleantrueWhether the bot process is currently onlinepingMsbodyintegerfalseWebSocket ping latency in millisecondsguildCountbodyintegerfalseNumber of guilds the bot is in β also synced to bot profileshardCountbodyintegerfalseNumber of active shards β also synced to bot profilememoryMbbodyintegerfalseCurrent RSS memory usage in megabytescpuPercentbodyintegerfalseCPU utilisation percentage (0β100)uptimeSecondsbodyintegerfalseSeconds since the bot process last startederrorsLastHourbodyintegerfalseUnhandled error count in the rolling last 60 minuteslastCrashAtbodystringfalseISO 8601 timestamp of last crash, or nullExample Request
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
}Responses
200{ "ok": true }
401Missing or invalid Bridge key
Errors are stored and surfaced in your bot's dashboard. Uses the same Bridge key auth as the heartbeat endpoint.
Request Body
NameInTypeRequiredDescription
messagebodystringtrueError message β max 2,000 charactersstackbodystringfalseFull stack trace β max 10,000 charactersExample Request
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)"
}Responses
200{ "ok": true }
401Missing or invalid Bridge key
Requires an active user session (cookie auth). Returns only tickets belonging to the authenticated user.
Response Fields
NameInTypeRequiredDescription
idbodyintegerβTicket IDsubjectbodystringβTicket subject linecategorybodystringβAuto-routed category (e.g. "bot-issue", "billing", "general")prioritybodystringβAuto-assigned priority: low | normal | high | urgentstatusbodystringβopen | in_progress | resolved | closedupdatedAtbodystringβISO 8601 timestamp of last activityResponses
200Array of ticket objects
401Not authenticated
Tickets are automatically categorised and prioritised based on your subject and body text. If you supply a
botId, live diagnostics are run on that bot and attached to the ticket for staff context.Request Body
NameInTypeRequiredDescription
subjectbodystringtrueTicket subject β 5 to 200 charactersbodybodystringtrueDetailed description β 10 to 4000 charactersbotIdbodyintegerfalseBotsList bot ID β triggers automatic bot diagnostics on creationExample 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"]
}
}Responses
201Ticket created β returns id, category, priority, and routing info
400Validation error β subject or body out of length bounds
401Not authenticated
Parameters
NameInTypeRequiredDescription
idpathintegertrueTicket IDResponses
200{ ticket, messages: [{ id, content, isStaff, isSystem, createdAt, sender? }] }
403Ticket belongs to another user
404Ticket not found
If the ticket status is
resolved, sending a reply will automatically reopen it.Parameters
NameInTypeRequiredDescription
idpathintegertrueTicket IDRequest Body
NameInTypeRequiredDescription
contentbodystringtrueMessage content β 1 to 4000 charactersResponses
201Message created β returns the new message object
400Content too short or too long
403Ticket belongs to another user or is closed
400Bad RequestMissing or invalid parameters
401UnauthorizedMissing, invalid, or revoked API key
403ForbiddenYou do not own the requested resource
404Not FoundResource does not exist or is not approved
429Too Many RequestsRate limit exceeded β 1,000 req/hr
500Server ErrorUnexpected internal error
Error Shape
{
"statusCode": 401,
"message": "Missing API key"
}