Skip to content
For bot developers · v1.0.0

Discord servers and bots API documentation

Look up servers and bots listed on DiscoListing, reward people who vote for you, and post your bot's server count so it shows on your page.

Base URLhttps://discolisting.com/api/v1

Reading data?

Server and bot lookups need no key. They return public data for approved, non-NSFW listings, using a Discord ID, listing ID or slug.

Votes or bot stats?

Vote checks, vote history and bot stats updates require Authorization: Bearer <API_KEY>. Create a key in Dashboard → your listing → Integrations. It only works for that listing.

Rate limits

Public lookups: 60 requests/minute per IP, even if you send a key. Key-required endpoints: 120 requests/minute per key. Exceeding either limit returns 429 with a Retry-After header in seconds.

Authentication

Send your key in the Authorization header on every request that needs one. Keys start with lst_; create and revoke them in your dashboard.

Header
Authorization: Bearer lst_your_api_key

Get a listed server

Public

GET/api/v1/servers/{id}

Parameters

idURL · required · stringDiscord ID, listing ID or slug
Example request
curl "https://discolisting.com/api/v1/servers/123456789012345678"
Example response
{
  "id": "6650f1c2a4b5c6d7e8f90123",
  "guildId": "123456789012345678",
  "slug": "cozy-gamers",
  "name": "Cozy Gamers",
  "shortDescription": "A friendly community for cozy and indie games.",
  "url": "https://discolisting.com/server/cozy-gamers",
  "inviteUrl": "https://discord.gg/cozy",
  "iconUrl": "https://cdn.discordapp.com/icons/123456789012345678/abc.webp",
  "memberCount": 1240,
  "onlineCount": 312,
  "qualityScore": 72.4,
  "votes30d": 87,
  "tags": [
    "minecraft"
  ],
  "category": "gaming",
  "languages": [
    "english"
  ],
  "nsfw": false
}
What each response field means
idstringListing ID
guildIdstringDiscord server ID
slugstringShort name used in page URLs
namestringDisplay name
shortDescriptionstringOne-line description
urlURLPage on this site
inviteUrlURL or nullLink to join the server or add the bot
iconUrlURL or nullIcon image
memberCountnumberMembers, from Discord
onlineCountnumberMembers online, from Discord
qualityScorenumberQuality Score, 0–100
votes30dnumberVotes in the last 30 days
tagslist of stringTag slugs
categorystringCategory slug
languageslist of stringLanguage slugs
nsfwbooleanAdult content: true for age-restricted listings

Possible errors

  • 404Nothing found with that ID or slug (unapproved, hidden and banned listings are not public).

Get a listed bot

Public

GET/api/v1/bots/{id}

Parameters

idURL · required · stringDiscord ID, listing ID or slug
Example request
curl "https://discolisting.com/api/v1/bots/123456789012345678"
Example response
{
  "id": "6650f1c2a4b5c6d7e8f90123",
  "botId": "234567890123456789",
  "slug": "cozy-gamers",
  "name": "Cozy Gamers",
  "shortDescription": "A friendly community for cozy and indie games.",
  "url": "https://discolisting.com/server/cozy-gamers",
  "inviteUrl": "https://discord.gg/cozy",
  "iconUrl": "https://cdn.discordapp.com/icons/123456789012345678/abc.webp",
  "serverCount": 5200,
  "shardCount": 2,
  "statsUpdatedAt": "2026-10-02T14:30:00.000Z",
  "qualityScore": 72.4,
  "votes30d": 87,
  "tags": [
    "minecraft"
  ],
  "prefix": "!",
  "nsfw": false
}
What each response field means
idstringListing ID
botIdstringDiscord application (bot) ID
slugstringShort name used in page URLs
namestringDisplay name
shortDescriptionstringOne-line description
urlURLPage on this site
inviteUrlURLLink to join the server or add the bot
iconUrlURL or nullIcon image
serverCountnumberServers the bot is in, as reported by its developer
shardCountnumberNumber of shards
statsUpdatedAtdate (ISO 8601) or nullWhen the developer last posted stats
qualityScorenumberQuality Score, 0–100
votes30dnumberVotes in the last 30 days
tagslist of stringTag slugs
prefixstring or nullCommand prefix, if any
nsfwbooleanAdult content: true for age-restricted listings

Possible errors

  • 404Nothing found with that ID or slug (unapproved, hidden and banned listings are not public).

Has a user voted recently?

API key

GET/api/v1/votes/check

True when the Discord user voted for the listing that owns the API key within the current cooldown window.

Parameters

userIdQuery · required · stringDiscord user ID
Example request
curl "https://discolisting.com/api/v1/votes/check?userId=123456789012345678" \
  -H "Authorization: Bearer lst_your_api_key"
Example response
{
  "voted": true,
  "votedAt": "2026-10-02T14:30:00.000Z",
  "nextVoteAt": "2026-10-02T14:30:00.000Z",
  "cooldownHours": 24
}
What each response field means
votedbooleanTrue when the user voted within the cooldown
votedAtdate (ISO 8601) or nullTime of their latest vote
nextVoteAtdate (ISO 8601) or nullWhen they can vote again
cooldownHoursnumberHours between votes: 24 for servers, 12 for bots

Possible errors

  • 401Missing, malformed or revoked API key.

Recent votes

API key

GET/api/v1/votes

Newest first. Paginate with `before` (the `votedAt` of the last item).

Parameters

limitQuery · number
beforeQuery · date (ISO 8601)
Example request
curl "https://discolisting.com/api/v1/votes" \
  -H "Authorization: Bearer lst_your_api_key"
Example response
{
  "votes": [
    {
      "userId": "345678901234567890",
      "votedAt": "2026-10-02T14:30:00.000Z"
    }
  ]
}
What each response field means
voteslist of objectNewest first

Possible errors

  • 401Missing, malformed or revoked API key.

Post bot stats

API key

POST/api/v1/stats

Report your bot server count. Sharded bots can post per shard with `shardId` and `shardCount`; the total is the sum of shard reports from the last 24 hours. Post at most once a minute per shard.

Body (JSON)

serverCountnumberServers the bot is in, as reported by its developer
shardCountnumberNumber of shards
shardIdnumberShard sending this report (sharded bots only)
Example request
curl -X POST "https://discolisting.com/api/v1/stats" \
  -H "Authorization: Bearer lst_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{"serverCount":5200,"shardCount":2,"shardId":0}'
Example response
{
  "serverCount": 5200,
  "shardCount": 2
}
What each response field means
serverCountnumberServers the bot is in, as reported by its developer
shardCountnumberNumber of shards

Possible errors

  • 400The request is invalid; the message says which field.
  • 401Missing, malformed or revoked API key.
  • 429Too many requests. Wait the number of seconds in the Retry-After header.

Vote webhooks

Instead of asking us, let us tell you: add a webhook in Integrations and we send a POST to your URL for every vote. Check the X-Listing-Signature header (t=<unix time>,v1=<signature>, an HMAC-SHA256 of t + "." + raw body with your signing secret) and ignore requests older than 5 minutes. Failed deliveries are retried for about 30 minutes.

Webhook body
{
  "id": "6650f1c2a4b5c6d7e8f90456",
  "event": "vote",
  "test": false,
  "data": {
    "type": "vote",
    "listingId": "6650f1c2a4b5c6d7e8f90123",
    "userId": "345678901234567890",
    "isWeekend": false,
    "votedAt": "2026-10-02T14:30:00.000Z"
  }
}

TypeScript SDK

View discolisting on npm

Optional helper that wraps everything above, including webhook verification. No dependencies; works in Node, Bun, Deno and edge runtimes.

Install
npm install discolisting
TypeScript
import { ListingClient, verifyWebhook } from 'discolisting'

const client = new ListingClient({
  apiKey: process.env.LISTING_API_KEY,
})

// Post your server count every 30 minutes
client.autoPost(() => ({ serverCount: bot.guilds.cache.size }))

// Reward voters (24 h cooldown for servers, 12 h for bots)
const { voted, nextVoteAt } = await client.hasVoted(interaction.user.id)

// In your webhook route (use the raw request body)
const ok = await verifyWebhook(rawBody, req.headers['x-listing-signature'], process.env.WEBHOOK_SECRET)

Also included: getServer, getBot, getVotes, parseWebhook and widgetUrl for the live embed widget. Errors throw ListingApiError with the status and, on rate limits, retryAfter.

Build a community people come back to

Practical guides for finding your people and growing a welcoming server.

All community guides
  • 3 min read · Community guide

    Discord Moderation Setup: A Practical Safety Checklist

    Set up Discord moderation with clear roles, tested permissions, AutoMod alerts and a reporting process. Includes checks for new members, bots and staff access.

  • 3 min read · Community guide

    Discord Server Rules That Help Your Community Thrive

    Write Discord server rules people can understand and moderators can apply fairly. Use practical examples for privacy, promotion, reporting and appeals.