#topgg-api
1 messages ยท Page 22 of 1
sorry about the confusion its now:
Am i doin something wrong or the links are broken ๐ญ
wrong put your BOT ID on ID

. thats what i did check the url man ;-;
you didnโt
you left it as id not your bot id
@signal harness heads up use botid not just id
i just said that
Hey why send test not work
did you use your discord webhook cuz that wont work
Yes I put
you need create your own webhook
In discord ?
Webhook integration for receiving vote data
Thx
@untold sparrow I need a favor
busy
say it
Why you help him ๐ญ
i made my webhook public for users and i got working for users whos not in the server im asking if can you join my support server and vote so i can see if voter role is working

just checking out this armory then ill be over
alr
no it worked second time
i went to https://top.gg/bot/***/webhooks but 404 found
@void estuary can u check? idk my bot is in review or not :3
sry for the ping
@fiery phoenix
hi
i don't see any bot of yours approved on the site
no one on review?
i can see you deleted mogger bot 35 minutes ago tho?
this is a server (they don't have webhooks yet unfortunately)
it's ok lol, tho if u deleted the bot it'll have to be reviewed again
it was approved but i tought its buggy
can i make it quick?
i waited so long ๐
wdym?
review
i'm not sure if the bot's info is saved after being deleted
it'll be added to the queue, tho it might be closer to the front since it's a resubmission
not entirely sure on that one sorry
oh damn
i got it now lmao i was so confused
but thanks alot
a lot
Hop on PC > go into edit channel (where u want the webhook) > Integration > Create Webhook > add a pic and change name if u want > copy it's link > paste it into whatever you wanna use it with
i think they mean a top.gg webhook
easiest way is https://webhook-topgg.com but it depends if they just want vote logs or if they want to integrate it into their bot to give people rewards etc
Simplifying top.gg webhooks for all users, allowing non-developers and developers to use webhooks for their bot and server without confusing configuration.
It should be available under the Integrations & API tab
yes the documentation needs changed, I can see if I can open a PR for that to get updated.
wot

Integrations & API
@icy aurora
How to refresh my bot's server count
where to find top gg api doc?
Welcome to Top.gg
doesnโt matter
im using old one
The only thing that can happen is that the old endpoint may be deleted and then you will have to move to the new one so it is better to use the new endpoint right away
Don't click that
Your bot must be approved on top.gg
To access the API, authorize requests with your Top.gg token. You can do this by creating a token from your project's Integrations & API settings.
Oki
Tysm
Love u
I need wait then?
Yea, most likely
Tyvm
yes
Hey y'all <@&1471335335605571837> (new ping), new API endpoint was added
You can use this in the event of any votes that you missed due to an outage, or if your desired platform does not support webhooks.
https://docs.top.gg/docs/API/v1/projects#get-votes
Here's some example usecases:
Scenario 1:
Your service went down, and in the meantime users kept voting. The webhooks failed to deliver therefore you manually fetch the votes, and process them.
GET /api/v1/projects/@me/votes?startDate=2026-02-12T01:58:55Z
Scenario 2:
You run a minecraft server and cannot publish a web http port on your server. You can run a fetch call which reads any new votes by taking the latest cursor from your response.
GET /api/v1/projects/@me/votes?cursor=a234edf9cca...
Hope this helps!
API resource for a projects such as bots or servers submitted on Top.gg
That's something I never considered and am going to add! thanks
I think something that could be cool as a github repo is a "vote replay app" which takes your whs_ token and your webhook URL and sends you recreated votes :) I would use it.
...Ideas! I love the new integration. ATM it's theoretical until I can get the bot through review and get the key but that's solid.
With my old bot one of the main issues was the voting container dying or whatever and people losing the vote rewards and it never occured to me to do something like this,
Probably because it wasn't possible yet! Now it is :)
So on boot it calls the api and then has some sort of checkpoint system to see if it needs to backfill
Thats sweet
Oh smart! May need to store the vote ids processed then
Cool I will do something whilst I wait for the review - thanks for the awesome usecase and idea for another voting bot ๐
@woven coral I wanna make a library for the api-types of top.gg (like "topgg-api-types") - could we add that to the community github?
-# Why? Some people want to do their own integration and not use the whole sdk
cc @vital anvil
ah, I asked you because you did the node sdk ^^
when it comes to adding libraries themselves, i believe Veld is the right authority here. i am just a library maintainer
ah ๐
Feel free to open one on your own GitHub @opal solar
I think itโs a good idea, but i also think that moving everything to the top gg community was a bad move long past. People who wrote the code should own it fully.
Let the ecosystem grow with freedom
wait what? what about the existing sdks?
they keep being maintained by us
I just don't want to add more stuff to it

It would only make the whole sdk lifecycle worse imo, and I don't have time to monitor/review even more repos :)
Though if you'd prefer to maintain an sdk under your own ownership. you definitely could
i just wanted to help because most of the sdks are heavily outdated haha ๐
frankly I don't mind needing a review from someone on the sdks I maintain, but if you feel too pressured by them, I understand
No worries at all! I appreciate you updating them, I wouldn't have any time to do it so it's appreciated!
Sure thing ๐
I thought of doing the schemas with zod or zod/mini and infer the types then.
So people can easily use the provided Schemas to validate payload and have a valid type on it.
Update: v1 types now done I think, except a few things
https://github.com/The-LukeZ/topgg-api-types
I also added some comments to it so I and others can understand it better.
starred it :D
^^ thx, I appreciate it.
I also added the v0 stuff now, I will jsut go to bed now and continue tomorrow/later.
If you got the time, could you review the TODOs, mainly in the v0 types, please? I got several questions about some fields and their values there ๐
v0 most likey will get removed
Curious as to the data.weight aspect of the new update
Oh well ๐
Then I'll mark it as deprecated as soon as the bots and servers endpoints are in v1
wait, those endpoints will still be available. I still need some clarification on some fields ๐
for now, v0 endpoints will continue to be available, but they will no longer be updated
or fixed (if there's any bugs)
subsequent updates will be for v1
Yeah I figured ^^
But I'm talking about those:
These are things where I had to assume stuff which were not really clear to me.
yes, these are a part of the old API
btw same goes for the SDKs, all of them will have a major update that removes all v0 features
and I would still like to provide the info until it gets removed :)
because I assume those endpoints will be migrated to the v1 api and then the old endpoints will be removed. However until that happens it might be months or a year
The new batch says v2 but is under v1
shrug
indeed, that is why I was waiting for a response
edit > integrations & API
I don't find
Is your bot approved on the site?
Yes
your profile -> edit -> integrations & api
any ideas why the "send test " button would be returning a "The destination URL rejected the request"

cos its being skipped already from cloudflare, and requests arent reaching my origin to begin with
and there are no blocks from cloudflare
your code is rejecting your request
๐ญ but a curl command works fineee
sighs let me try
(trying with fastapi soo yhh)
finally it works
had to delete and re-add
(same code still)

I need help with having my botghost bot detect when my server is voted for
huh
@opaque breach
@icy aurora
yea that Legacy webhooks
It's not working.
?
He's saying to do it yourself but in an odd cryptic way
... I'm not able to.
I haven't had a play with this yet as I am awaiting approval but have you looked at the code example they offered?
i sure do hope i configured mine ๐๐๐
by all accounts when in test mode
logged to my dashboadd hit vote got my 12h premium and a message wss posted
Yes, this ID doesn't work, bro.
I have the framework set up to add a counting save token on vote + backfill missed votes but waiting on ye old stamp of approval.
Look at this
I didn't understand anything from that example; it's all very strange.
skill issue

?
I thought that I would keep one webhook that sends events to the test version of my website then uncheck all events when I don't need to test anything (so I don't have to edit the webhook secret each time, and for Top.gg to not send events to the offline test website), but is it possible to edit the webhook events after creation ?
Does anyone know how to get the total number of votes from the bot?
hey @signal harness ^
Check documentation
Trying to post my bot's commands gives me a "The JSON value could not be converted to System.Collections.Generic.IReadOnlyList'1[Topgg.Data.Entities.Commands.MinimalApplicationCreatePacket]. Path: $" and "The createPackets field is required." error. The hell is this? It's not mentioned anywhere in the docs.
What is your payload?
{
serverCount: client.guilds.cache.size,
shardId: client.shard?.ids[0],
shardCount: client.options.shardCount || 1,
}```
these aren't commands
API resource for a projects such as bots or servers submitted on Top.gg
oh I just had a brain fart there
that isn't my payload
this is```js
[
{
options: [ [Object], [Object], [Object], [Object] ],
contexts: [ 0 ],
defaultMemberPermissions: '0',
name: 'watch',
description: '(admins only) Follow a gameโs news feed or price changes (maximum 25 of each per server)',
},
{
options: [],
contexts: [ 0 ],
name: 'watched',
description: 'See what games are being watched in this server.',
},
// etc
]
stringified of course
Oh and I'm using api._request from the official SQK
๐ค I don't think the official SDK supports the v1 api yet on this
@woven coral would know better tho
I mean, looking at the code, all it does is add the authorization and content-type headers and prefix the API path
a new update with the new v1 features is still yet to be published, sorry!
const api = new Api("Bearer foobar");
api._request("POST", "/v1/projects/@me/commands", JSON.stringify(topggCommands))
```should work, no?
the Node SDK pull request is very close to completion though
i am still waiting for Veld's response in #topgg-open-source 
ooooh wait I misread the code
_request does call JSON.stringify
so I shouldn't use it
yes
yeah it means the api endpoint wasn't able to serialize your JSON payload into the appropriate schema
It should have a better error
Hey, webhooks don't include the user's language anymore? I used to get it with vote.query.lang (although that I'm not certain this was ever valid)
It's not in the headers either.
It would be nice if is was added to the user data in the body, or as an accept-language header. My bot does have the vote reward message localized, it's a shame I have to default to English.
-# (I promise this is the last of my questions, upgrading the webhooks was the last step of my upgrading to the new API)
it never include it and we got new webhook system
I am using the new webhooks, yes
it was
I need to re-add queries yes
fr?
Ah, I knew I wasn't crazy
Buna ziua aveศi emisiunea jumฤtatea mea stie kanal d 2013 toate episoadele
Dacฤ aveศi link
รn romana spune
Wild question for this channel
รn romana spune
bless you
I wonder what goes through the mind of someone barging in a server, speaking a completely different language, and expecting people to understand
This seems completely unrelated to Top.gg as well, let alone the API
@signal harness give me url
Where to extract api?
What do you mean
Docs page not found
This is
Iโm clicking on it
Itโs not
Not sure why
Welcome to Top.gg
Just go here
And then click API -> V1 -> Introduction
Or V0 has more endpoints
I want to know api key
Got it
So what exactly is the point of the new API standard for secrets if it's just using symmetric keys? I get that they can't be intercepted and becomes a way to validate it, but still. Asymmetrical seems more appropriate so that we can't ever get the key, meaning no adversary could either, thus raising the bar for security all around.
How should asymmetric keys work for API keys
Without encrypting or signing the request at least
Would then slap an encryption layer over an existing one for everything and other services, which isn't what an API token/key is supposed to do
Can someone help me?
Not if you don't ask anything - https://dontasktoask.com
do i need to compute hmac
You would sign it? Lol
I mean the hash is essentially already doing that, but it's symmetrical. Idk just seems backwards IMO. Realistically they could use one asymmetrical key set for all API calls and have the validity with less risk of exposure.
How can I update the guild size on top.gg? I don't see any docs about that on the api
Hello,
I'm a bit confused about the top.gg API and the procedures for accessing it.
I contacted support and they told me to go to their documentation (the URL doesn't work and I've searched but haven't found it) and they require a bot approved by their site.
What do they mean by that? Because I have one that's on their site, so I assume I can use it?
API resource for a bots or apps on a platform like Discord
void topgg_post_stats(dpp::cluster &bot) {
std::string topgg_token = palette::services::get_env_value("TOPGG_TOKEN");
std::string body =
"{\"server_count\":" + std::to_string(dpp::get_guild_count()) + "}";
std::multimap<std::string, std::string> headers = {
{"Authorization", topgg_token}, {"Accept", "application/json"}};
std::string bot_id = bot.me.id.str();
bot.request(
"https://top.gg/api/bots/1470481920100925683/stats", dpp::m_post,
[](const dpp::http_request_completion_t &r) {
std::cout << "Status: " << r.status << "\n";
},
body, "application/json", headers);
}
Why am I getting 400 here?
400 means bad request
Yeah I know, but why, it says:
{"message":"Required parameter 'server_count' or 'shards' missing"}
But I did include it
any source or code for the rewards vote and how it should work?
you are missing server_count
nvm
idfk python
ab
i canโt tell since im on my phone with 1 bar of LTE
it is cpp
hey is there a bug on topggs Integrations & API tab? I setup my webhook here and still receive events, but now the page says 0 out of 3 webhooks used ? looks like they updated it with some new stuff recently, but can't really find what i need
Ah I see, interesting that the legacy stuff isn't visible even though its still functioning it seems
yes but they will be removed here soon idk when but highly recommend start using v1 api
cool, appreciate the heads up!
Veld did say hes not actively removing it yet
Its gonna stay in maintenance mode until a time its ready to be discontinued
Theres a drop down on the integrations and api page
Right at the bottom called Legacy Webhooks
oh lol didn't see that cheers
I gotta get my bot up on your site, looks neat ๐
Hi all, I have recently made a C++ library that uses D++ to listen to HTTP requests from top.gg. Essentially, a top.gg webhook library. You can use it to verify both bot and guild votes and it parses top.gg's JSONs to present them in a struct with every value ready to be used. The API version it uses is v1. As far as I can tell, there's no other C++ library that does this.
Here's the lib's GitHub link:
https://github.com/Henonicks/DPPTGG
Let me know your thoughts!
A D++ program that listens to requests and handles them if they're from top.gg, to compliment my D++ bot Guiding Light - Henonicks/DPPTGG
awesome :)
Thank you!
Missing content type header.
Weird syntax ๐
Good to know, thanks.
A lot of poeple left lately 
Hi, I'm confused on how to use the "Get Vote Status By User" endpoint:
https://docs.top.gg/docs/API/v1/projects/#get-vote-status-by-user
Am I supposed to send a JSON with the query parameter source? When I send this JSON: json {"source":"discord"}
I get a 400 error. And yes, I'm using the GET method.
API resource for a projects such as bots or servers submitted on Top.gg
It's query param
Not a JSON param or body
Are query params the things after domain/path??
A query string is a part of a uniform resource locator (URL) that assigns values to specified parameters. A query string commonly includes fields added to a base URL by a web browser or other client application, for example as part of an HTML document, choosing the appearance of a page, or jumping to positions in multimedia content.
A web serve...
Not sure what you mean with that. but the parameters are the key-value after a ? separated by &
I see, thanks, I completely forgot about those
sending some body on a GET request usually fails or gets ignored because it simply shouldn't be done
makes sense
Is there a page with all the errors JSONs I might get? I'm reading the /v1/ docs and there's an object that doesn't match the JSONs I've gotten from different endpoints
In "Get Votes" (https://docs.top.gg/docs/API/v1/projects/#query-parameters)
What's a cursor and how is it formatted?
API resource for a projects such as bots or servers submitted on Top.gg
Pagination cursor from a previous response.
So you make a request, if response is too large, the cursor would be used in a subsequent request for the next batch. Repeat until all results are returned. Mainly keeps content length short and quick to process/reply so it doesn't bog down the system.
It's literally right there so I'm not sure how you missed that lol
My question is mainly "what's the format"
If "pagination cursor" is a universal term then I didn't know that
I don't even know why I asked what a cursor is
How do I get/set the "authorization" value for webhooks? I have a created a working webhook, but I don't know what authorization value the webhook is looking for.
it starts like this whs_ and you will see it when you add new webhook and this is for v1 webhooks
btw that token will not work cuz its been deleted and it only can be used on that project
Ok, thats what I tried to use but it never worked, and I am pretty positive it was updated
ok thanks
Webhooks V2 for receiving real-time event data from Top.gg
its basically just a hex token that we encrypt some metadata into for your request
so you should treat it as a string
Oh, so I'm meant to give topgg a start date and then use the returned cursor in my next api calls?
Yeah itโs cursor based pagination
Design wise the reason why we went for cursor based pagination is so that you an use it as an alternative to the webhook
I see, thanks, was so confused on that
This is exactly what I'm implementing in my lib, so that those like me who don't have a way to host an http server could still "listen" for votes
Yeah generally what i recommend is for people to implement both and store the vote id for idempotency
It gives you a safeguard to a single point of failure
What I'm making is just an API, people can store the vote ID if they like, I'm just letting them have it
makes sense
I still have that question, what do I expect in an error when a request to top.gg fails? The docs only show something that doesn't match reality
ever since switching to new webhooks small percentage of votes get delayed by ~5-10 minutes
im not 100% sure it isnt on my side, but it didnt happen before the switch, nor do i think anything in my code can delay it that much
i can send user ids and rough timestamps
some people also claimed it didnt go through at all
it's not you
i noticed a 5mins delay yst
i thought i fried my code without touching it
๐ค all of em should appear at minimum, but sometimes there seems to be a delay indeed
@tidal plover i checked your project's logs for you.
tl;dr
100% success rate, max latency is 25 seconds, avg latency is 460ms
data is from the last 1000 processed votes
ok new info it appears to show "you already voted in the past 12 hours" to users when it does that (even if its been over 12 hours)
hmmmmm
do they have screenshot?
prolly has an error message underneath
times are in gmt and arent super accurate
1295500443371442250 march 3rd 11:21 am
885044386130440233 march 2nd 2:34 pm
553093932012011520 march 3rd 6:23 am
552599390498455574 march 2nd 11:48 am
1308141070017626193 march 3rd 11:25 am
344637751208968192 march 2nd 8:30 pm
ok i have 5 different confirmations that error was seen when it happened
yes
a few more
1029133865027121202 march 3nd 1:55 am
885044386130440233 march 2nd 2:30 pm
614098831113584640 march 3rd 12:50 pm
lemme see
885044386130440233 last voted utc 2:36am
is that a vote u missed from webhook? 
@tidal plover
what do you mean by that
885044386130440233 march 2nd 2:30 pm
2:36am is 12 hours later
or do you mean thats when they are supposed to be able to vote again?
would mean they can vote again in ~7 minutes
i asked people to dm me of the time they got the bug and thats the time they gave me 
actually, let me just add a timer on the vote page 
gotcha
can u ask them otherwise to join here and reach out to me?
I'm happy to help them out 
Could be good learning for the top.gg voting experience too
I thought I'd share this, I added support for API calls to top.gg's /v1/ endpoints
https://github.com/Henonicks/DPPTGG/pull/4
There is no other way yet afaik
Where is the documentation for the server count API?
API resource for a bots or apps on a platform like Discord
scroll down to "Post Stats" subtitle
Hey, I tried implementing the "Last 1000 Votes" request and whether the ID I provide is the ID of my own bot (the one whose token I'm using) or not, I get a 200 status and a response that's simply []. "Search Bots" works fine with my setup. My bot only got 86 votes this month. Is this a server-side issue?
Last 1000 votes endpoint still doesn't work afaik
Maybe you can do something similar with https://top.gg/api/v1/projects/@me/votes endpoint
Oh, alright, I don't really need that as this is for a library but I was just wondering if I was doing something wrong
Now I'm POSTing this JSON to /api/bots/<bot_id>/stats json {"server_count":64,"shard_count":1,"shard_id":0,"shards":[]}
But even though the API returns 200, when I get the stats for the same bot, I get this in return: json {"server_count":0,"shards":[],"shard_count":0}
Am I doing something wrong this time?
I have no idea how this works but it seems that if I send anything but {"server_count":num} then the server count will be 0
I have read this chat's history and found out you don't support that anymore
Man I hate these docs
Where do i find the webhook secret that i will use for voting ?
Those are legacy and arenโt used anymore not sure why though
uh then how do i do the vote tracking?
You just pass the webhook URL
i mean i can use the legacy thing right?
Yes
You still need a webhook secret to verify that the http requests come from top.gg
Where would that be? I donโt use one
Ya thatโs to enter it there is no secret
It shows the secret once and then you have to create another webhook if you want to get a secret
Your right I didnโt see that when I made mine thanks for helping
once you create a webhook you will see the secret @modern geyser
okay !
I must change mine XD
I don't actually know how the v0 webhooks worked 'cause I used a third-party service for those but recently they went down for a reason unknown to me so I had to work with top.gg's v1 api
It was the same
๐
You passed a webhook and secret and it tracked votes really no difference between the two but v0 is no longer supported as in terms of bug fixes from my understanding
Right, so apparently, the v0 "Individual User Vote" GET endpoint only gets the vote for the owner of the token, regardless of the bot ID provided?
and POST/GET server count work the same way
the :bot_id in the URI seems pointless then
I replaced every :bot_id with 0 and the ID of a random bot on top.gg and it works the same way as if I used the token owner bot's ID
Continuing on with my adventure, I have now added support for the v0 endpoints (all of those that actually work):
https://github.com/Henonicks/DPPTGG/pull/7
I had mostly no clue whatsoever about what I was doing since the docs are so outdated and some fields just refused to work for me but this finally exists
There are 2 types of tokens afaik (v0 and v1 tokens). v0 tokens doesn't work for v1 endpoint but v1 tokens should work for v0 endpoints
How to know which token mine is
How did you use it exactly?
Which endpoint?
/v1/ endpoints require you to append "Bearer " in front of your token:
Bearer to.k.en
According to my experience, the v1 token is fine for the v0 endpoints
The Bearer part only depends on the endpoint you're making the request to, not where you got the token from
I fixed it
Nice
I used legacy api token
Hmmm. Any issue with shard count in the stats api? Site is only showing the last shard that submitted a count (and not showing a shard count either) and the api GET is still returning the old shard count
It's been silently deprecated
Only the guild ID is supported
this one i mean
yep, the last three are broken
this is where I got to figure that out
alright so gotta do my own server count aggregation then...
Oh, are you using an outdated library?
i'm posting from each shard individually
that worked fine before..
server_count: number of servers on current shard, shard_id: current shard, shard_count: total shards
those were probably some good times
yea seems to be broken for a while already it seems
as well as three /v0/ endpoints
Sorry I'm a bit confused, it mentions that v1 doesn't have stat posting, am I suppose to use v0 for that then, or should I just not include it for now?!
You have to use v0 for that right now
Okay thank you, and I assume I have to wait for approval before I can get a token?
Doesn't seem to be there yet?
your bot needs to be approved first before getting api
your bot is still in queue
Ok that's what I originally thought thank you
ount
thankyou this helped me alot
a
b
No bro
c
d
e
f
@signal harness kinda annoying
@signal harness
thanks
So there is an api that I can use for an accurate vote timer?
Thank you sir!
import express from 'express';
import { Webhook } from '@top-gg/sdk';
import { TOPGG_API_KEY, TOPGG_PORT } from 'core/variables';
import { redis } from 'utils/redis';
const app = express();
const webhook = new Webhook(TOPGG_API_KEY);
app.post(
'/webhook/topgg',
webhook.listener(async (vote) => {
try {
console.log('Vote received:', vote);
const userId = String(vote.user);
const votedAt = new Date().toISOString();
await redis.incr(`topgg:votes:user:${userId}`);
await redis.sAdd('topgg:votes:users', userId);
await redis.set(`topgg:votes:last:${userId}`, votedAt);
const totalVotes = await redis.get(`topgg:votes:user:${userId}`);
console.log(`User ${userId} total votes: ${totalVotes}`);
} catch (err) {
console.error('Webhook error:', err);
throw err;
}
}),
);
app.use(express.json());
app.listen(TOPGG_PORT, () => {
console.log(`Top.gg is listening on port ${TOPGG_PORT}`);
});``` did i do sum wrong? its not logging anything
the website returns The destination URL rejected the request
(the webhook thing is using the auth, i just call it api key)
Uhh did you try moving app.use(express.json()) to happen before any routes? Middleware in express is order sensitive
hey
this isnt going be thing anymore
Top.gg Webhooks V2 example using nodejs and express - top-gg/webhooks-v2-nodejs-example
and the way you are putting your webhook is the for v2
oh yeah new api
that why is getting rejected
my bad chat
tthanks
plus VELD needs start working on somethin
Oh
router.post("/webhook/topgg", async (req, res) => {
try {
console.log("Received Top.gg webhook request");
const signatureHeader = req.headers["x-topgg-signature"];
if (!signatureHeader || !req.rawBody) {
console.warn("Missing signature header or raw body");
return res.sendStatus(401);
}
const parts = Object.fromEntries(signatureHeader.split(",").map((p) => p.split("=")));
const timestamp = parts.t;
const receivedSignature = parts.v1;
if (!timestamp || !receivedSignature) {
console.warn("Invalid signature format");
return res.sendStatus(401);
}
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) {
console.warn("Webhook timestamp outside allowed window");
return res.sendStatus(401);
}
const message = `${timestamp}.${req.rawBody}`;
const expectedSignature = crypto
.createHmac("sha256", process.env.TOPGG_WEBHOOK_AUTH)
.update(message)
.digest("hex");
if (receivedSignature.length !== expectedSignature.length) {
return res.sendStatus(401);
}
const valid = crypto.timingSafeEqual(
Buffer.from(receivedSignature, "hex"),
Buffer.from(expectedSignature, "hex")
);
if (!valid) {
console.warn("Invalid Top.gg signature");
return res.sendStatus(401);
}
const payload = req.body;
console.log("Parsed payload:", payload);
if (payload.type === "webhook.test") {
console.log("Top.gg webhook test received");
return res.status(200).json({ ok: true });
}
if (payload.type !== "vote.create") {
return res.status(200).json({ ignored: true });
}
const userId = payload.data?.user?.platform_id;
const username = payload.data?.user?.name;
if (!userId) {
return res.status(400).json({ error: "Invalid vote payload" });
}```
const app = express();
const port = 48433;
app.use(
express.json({
verify: (req, res, buf) => {
if (req.originalUrl === "/api/webhook/topgg") {
req.rawBody = buf;
}
}
})
);
this would work
I would argue that returning a 200 status when the request is ignored might not be the best approach
In res.status(200).json({ ignored: true });
Perhaps a 405
Itโs returned to top gg server
Soo they donโt send it again
Otherwise until you send 200 server will send you request until 3 times
no
Top.gg Webhooks V2 example using nodejs and express - top-gg/webhooks-v2-nodejs-example
Itโs literally the same
๐งธ
I just add up extra checks
And yes this snippet is working perfectly
itโs not
tf?
the code i gave
is working
and yes it's same
if u even know basic of js you would understand
my bot runs on js but wtf
ill read that code on my pc after work
this small as phone aint helping
becuase i have 20 other routes
i got 10 routes

its not amess
Making routes is more fun in sveltekit imo
mine is
i am so tired making this


dont think so
I still have my old legacy webhook setup intact and top.gg does in fact send votes to my new webhook
yes
is there an api to get stats from bots with the topgg api?
nope only from your bot
but all youโre gonna get is server count
Hmm
i only get the stats from my own bot not from the bot to fetch
The endpoints that pretend to support other bot IDs don't according to my experience
afaik you can't even get a bot because the endpoint for getting info on a singular bot is down
Or at least it was
bots is really unreliable for this, obviously
hmm :/
Hello,
I updated my bot today and the server count on discord isn't getting updated the autoposter doesn't work anymore?
autoposter still works it takes 30 minutes to upload for autoposter because rate limits
it takes little longer to the page to update but if you request the stats by api you can see itโs been updated
anyone pulling/scrapign review #'s?
what tho API do on this?
yeah curious if anyone was scraping it already, no api for it
The v1 project struct contains the amount of reviews and the review score
I don't think you can get project info of someone else though
SLAM ALIKOM
API resource for a projects such as bots or servers submitted on Top.gg
yeah wow was in the open my eyes section
thanks for that appreciate it dunno how i missed it
For the โnewโ webhooks, am I right with saying that sometimes the avatar url isnโt sent? When is this the case?
@vital anvil hey do you mind answering this?
it should always send the pfp that we have
keep in mind this is not the discord pfp, this is a top.gg pfp.
if you want the discord profile pic, you need to fetch the discord object
Yes as in they always do, ok
Which is either their discord one or one they uploaded to top?
yes, right now its either a discord cdn or top.gg cdn link
in the future it would only be top.gg cdn links
Maybe Iโm doing something wrong in my code but it seems sometimes I donโt get a pfp, but I can look into it just havenโt had the time lately
Thanks
Welcome to Top.gg
ok
may I please know why its NOT accepting my token. And it does have read and write permissions
401 Unauthorized (You need a token for this endpoint)
The api client for the v1 API changes is not yet released. This is a community effort 

I know it's a bit of a common joke that no one knows how to use HTTP methods properly... But PUT for creating a new announcement, really?.. Yet POST for metrics and commands, even though these do override the existing data? Who did this?
Not to mention the fact that v0 has been the only way to post stats for years and still is
No no, they did recently add the /metrics endpoint in v1. It should be using PUT and not POST, but it's there.
Oh my days this was three days ago
I've been waiting for this the whole two months or so
Okay my bad
But the real head-scratcher is the /commands endpoint. They (kindly) designed it so you can use the exact same payload as when bulk-overwriting command to Discord. And that action on Discord's side... uses PUT.
lmao
can't wait for a change to happen to make the endpoint documentation outdated for at least three years
If my network professor was here he would be very upset
That's a failed assignment right there
"bro" I am NOT your brother

i'd rather fail an assignment than fail running a business
but ya
we'll see what we can do
I understand it's low priority but like
it's triggering my autism
good for you someone in the team is also annoyed by it so it's pushed upwards because they will do it

@vital anvil Hey, for the metrics endpoints it accepts the shard count but I can't see where this is displayed on the site? What is it used for exactly? Also, there's a batch endpoiint for metrics also. What's the use case for this? As surely only the most up to date server count for example matters. OH is this for like server count tracking?
also, "required" for response fields just feels wrong... these aren't required responses these are just not optional?
Yeah itโs not actually displayed on the site
Weโre working on a new โinsightsโ page thatโs going to be your new social proof home
@signal harness clankers at the gate
https://docs.top.gg tells you how
Everything you need to integrate with Top.gg: REST API reference, webhooks, vote tracking, and community SDKs for Discord bots and servers.
@signal hawk sirr can you tell me how I can make thing like when someone vote my bot on top.gg it send voting message in support server
@vital anvil
those noobs, eh?
A link to the docs was literally just posted, but no, gotta ping two staff members.
@strange palm this
yes, this
K
It has a big "webhooks" button that will lead you to a step-by-step tutorial with a code example
It's actually quite simple, assuming you're not completely new to programming...
{'type': 'webhook.test', 'data': {'user': {'id': '265.', 'platform_id': '9187.', 'name': 'annomy9257', 'avatar_url': 'https://cdn.discordapp.com/avatars/91877/8f9d2.png'}, 'project': {'id': '5.', 'type': 'bot', 'platform': 'discord', 'platform_id': '10190'}}} None```
why is authorization None?
What do you mean, "authorization"?
Ah, you're trying to upgrade to the new webhooks
There is no authorization header anymore, instead x-topgg-signature
https://docs.top.gg/webhooks/overview
Top.gg webhooks deliver real-time vote events to your server via HTTP POST requests, letting you reward voters instantly without polling the API.
oh alright
What solution do you guys use for updating guilds?
I feel like there is 2 options having it automatic push everytime a guild joins or leaves
Or having it just push the number every x hours?
Every x hours is fine, nobody cares about guild count anyways
The default for the auto poster is every 30 minutes. Posting every change is definitely against guidance. The UI also doesnโt update as you post it either as itโs cached out. So updating so often is pointless
Huh
Hey so I finally got around to adding some logs for avatars. I got a response where the avatar_url gives a 404 response back. The user definitely has an avatar though
gotcha - if they are discord cdn avatars, you can't really rely on us having the latest data
use the cached discord ones you have
yeah we are working hard on the changes to move things to our CDN
No worries i can just fetch the user for now
thanks for the hard work, I saw #announcements too super cool
Does anyone know why it takes so long to verify when claiming rewards? It usually takes around 10 - 20 seconds
nvm i figure it out
thanks me
Hey, can anyone help me out how to know if page_content update actually worked?
if it returns a 2xx status code, it's updated. give it up to an hour to sync on the website
I recently implemented voting. However, the votes are stuck and don't go up. Infact it has gone down from 41 to 35 since the last week and is stuck at 35. Is it common? I don't understand how this works
Was the query field removed from responses in the new webhooks? I didn't see anything about it in the docs (besides the fact that it's missing) - is there no way to receive the query params anymore?
yep
I used to use to to give a localized notification, but alas
Will add it to the backlog to re-introduce it!
That'd be awesome! Thanks!
I just noticed are query strings no longer supported with webhooks v1?
This is pretty fatal I use them to bind a vote to a guild
@runic ginkgo
Yeah saw that
Got the same worries but I think veld said that the deprecated webhook system is staying for a while
Yeah but I'm sadly using webhooks v2 as my bot is a direct integration ๐ซ
number
question for the new topgg webhook system, what are the valid Types? Webhook.test and what? How do ik a user votes for the bot to log it?
vote.create
Top.gg v1 webhooks notify your server in real time using HMAC SHA-256 signatures. Supported scopes include vote.create and webhook.test.
oh yh thanks, I found it and dove into it yesterday
Timeout too fast fast i think
@meager acorn What error do you get from the api call itself?
How have you implemented this on the code side?
wait
// Top.gg vote webhook verification middleware
function verifyTopggWebhook(req, res, next) {
const secret = process.env.AUTHORIZATION; // Set in Top.gg dashboard as "Webhook Authorization"
if (!secret) {
return res.status(503).json({ error: 'Webhook authentication not configured' });
}
const auth = req.headers['authorization'];
// timingSafeEqual prevents timing attacks
try {
const authBuf = Buffer.from(auth || '');
const secretBuf = Buffer.from(secret);
if (!auth || authBuf.length !== secretBuf.length || !crypto.timingSafeEqual(authBuf, secretBuf)) {
return res.status(401).json({ error: 'Unauthorized' });
}
} catch {
return res.status(401).json({ error: 'Unauthorized' });
}
next();
}
// Route
app.post('/webhook/topgg/vote', verifyTopggWebhook, async (req, res) => {
return await processVote(req, res);
});
Webhook verification
async function _processVoteInternal(req, res, user, type, isWeekend) {
const db = require('../database/database');
let wizard = await db.getWizard(user);
if (!wizard) wizard = await db.createWizard(user);
// Base rewards
let crystalReward = 75, coinReward = 5000, expReward = 40, couponReward = 1;
// Weekend double rewards
if (isWeekend) {
crystalReward *= 2; coinReward *= 2;
expReward *= 2; couponReward *= 2;
}
// Streak tracking
const now = Date.now();
const timeSinceLastVote = now - (wizard.voting?.lastVote || 0);
wizard.voting.currentStreak = timeSinceLastVote < 86400000
? (wizard.voting.currentStreak || 0) + 1
: 1;
wizard.voting.totalVotes = (wizard.voting.totalVotes || 0) + 1;
wizard.voting.lastVote = now;
// Streak multiplier (up to 2x)
const mult = 1 + Math.min(wizard.voting.currentStreak * 0.1, 1);
crystalReward = Math.floor(crystalReward * mult);
expReward = Math.floor(expReward * mult);
// Milestone bonuses (10, 25, 50, 100 votes)
// ... milestone logic ...
// Save rewards
await db.addExperience(user, expReward, 'vote');
const fresh = await db.getWizard(user);
fresh.voting = wizard.voting;
fresh.crystals = (fresh.crystals || 0) + crystalReward;
fresh.coins = (fresh.coins || 0) + coinReward;
fresh.premiumCoupons = (fresh.premiumCoupons || 0) + couponReward;
await db.updateWizard(user, fresh);
// Send DM notification to voter
sendVoteNotifications(user, fresh, { crystalReward, coinReward, expReward, couponReward, ... });
res.json({ success: true, rewards: { crystals: crystalReward, coins: coinReward } });
}
Vote processing
const { Api } = require('@top-gg/sdk');
const topggApi = process.env.TOPGG_TOKEN ? new Api(process.env.TOPGG_TOKEN) : null;
// Post server count every hour
if (topggApi) {
setInterval(async () => {
const serverCount = client.guilds.cache.size;
await topggApi.postStats({ serverCount, shardCount: client.shard?.count || 1 });
}, 60 * 60 * 1000);
}
Stats posting
// 3-tier cache: memory (5min) โ DB (lastVote within 12h) โ Top.gg API
async function checkVote(userId, botId, forceRefresh = false) {
// 1. Memory cache
const mem = _voteCache.get(userId);
if (!forceRefresh && mem && Date.now() - mem.checkedAt < 300_000)
return { voted: mem.voted, source: 'memory' };
// 2. DB cache (wizard.voting.lastVote)
if (!forceRefresh) {
const wizard = await db.getWizard(userId);
const lastVote = wizard?.voting?.lastVote || 0;
if (Date.now() - lastVote < 43200000)
return { voted: true, source: 'db' };
}
// 3. Top.gg API (rate-limited, max 50 calls/min)
const res = await fetch(
`https://top.gg/api/bots/${BOT_ID}/check?userId=${userId}`,
{ headers: { Authorization: process.env.TOPGG_TOKEN } }
);
const data = await res.json();
return { voted: data.voted === 1, source: 'api' };
}
Vote check for gated commands
Try without posting shardCount
okay
Will the problem go away?
Maybe
okay
โ ๏ธ Top.gg stats post skipped:
It doesn't say anything
yes
yes
Hi @vital anvil, is the https://docs.top.gg/api/v1/projects#get-/projects/@me route currently not working?
@golden adder since you requested this a while back ๐
hmm not sure
I can take a look for you
seems to be working
I should've deleted this, I was being an idiot. Thanks anyway and sorry to bother
d3fb688 Remove broken or removed endpoints - marcorennmaus
Removes the documentation of both /bots/:bot_id and /bots/:bot_id/votes of the Legacy API, both of which haven't been working anymore.
e3e0545 Remove leftover references - marcorennmaus
first
second
THIRD
:^)
cheeky cunt aetheryx
i like discord.js it fast
hi
okay let's not I'm not sure if this is supposed to be unlocked

(โฏยฐโกยฐ๏ผโฏ๏ธต โปโโป
the java library has only blocking requests please fix kthx
@sudden rampart 
aio
~ ( . - . ) ~
Quit chatting in here like it's general.
Chill or ban please be nice in here, dont chat too much โค
Read the channel description
nice api
None of the libraries respect ratelimits
Suggestion: for the widget demo, use one of the user's own bot ids or luca if they dont have any. so less bias ig
seriously, get out of here if you aren't actually discussing the API
Now this a channel, this is also a thing: https://github.com/MattIPv4/DiscordBots.org-API-Examples
Feel free to use the examples (or maybe contribute).
This acts as the replacement for #312614469819826177 with verified examples that are the best they can be.
DiscordBots.org-API-Examples - Bot Stats API Examples for DiscordBots.org
For the dblapi.js, what do we put for the token/key in const dbl = new DBL('token/key thing', client);?
Your bots' API token
go to your bot's edit page
mk
and scroll down
thank you
do i need to change to the new library for the api (i'd be using the js one), or is what I was using before still going to work?
old one should work
thanks, i'll get arround to updating eventualy
/bot/:ID/vote doesnโt seem to work for me
replace :ID with the bot's ID
i did
/bots/
oh lemme try that
hey admins thanks for the docs
really helpful
actually it's kinda funny because I was looking at the docs this morning and couldn't really figure out how to use widget
the hell it still isnโt working
@cobalt ruin is there any documentation for the https://discordbots.org/api/widget/status/:ID widget?
.
oboy
@dawn jay don't ping website admins, mods or community managers at all just ask or ping one mod
kthx
has been suggested
https://this-is.definitely-not-a-sketchy.host/fd5eb74ef2.png which fields can be used for these? any? for string fields (such as username), how do they work, contains, equals, case sensitive?
any fields, contains case insensitive
okay thanks
https://discordbots.org/api/docs here's no use of a session in init here?
I can
and imo the client should be made in init with bot.loop
Wow that py example
Imports messy af
Creating a session and doesn't use it
bot = bot wtf
Should be self.bot =
Id need to be changed to id
http://prntscr.com/idd53k
Just use the python examples in pins
and you ain't even using the client https://github.com/DiscordBotList/DBL-Python-Library/tree/master/dbl im reading source
DBL-Python-Library - A simple API wrapper for discordbots.org written in Python
Pinsssss
@golden wind read up
A disaster of a lib imo
oliy
python won't detect that I installed dblpy
it says package not found
but i installed it
ugh
just do aiohttp requests yourself instead of using a broken wrapper
lol
as shown in the py examples in pins
ill pr when i get home from school lol
ye i mean it would be helpful if you pr'd or told me which bits were messy so i could fix it instead of just shitting on it ๐
pls don't steal my chance
constructive criticism
@golden wind as oliy said read up, I made a listen of issues with the example
ye i read up
@golden wind in __init__ it should be self.bot, why create a session you don't use?
ID and token should be allowed in the client init
client should be created in the cog init, with the bot.loop as loop
Imports messy af - dblpy imported, then you do a from? Just do the from.
You create a random session in init which is never used???
bot = bot should be self.bot = bot
Should be two linebreaks before the class declaration
```The event loop_ to use for asynchronous operations. Defaults to None,
in which case the default event loop is used via asyncio.get_event_loop().
```The `event loop`_ to use for asynchronous operations. Defaults to ``asyncio.get_event_loop()``.
that's your docstring for the client in source above, below is my version ๐
๐
Install from source should be:
pip install git+https://github.com/DiscordBotList/DBL-Python-Library
Constructive, please.
Basically
Any criticism or improvements can be sent to the repo in the form of issues and PRs.
If it's not fixed this time tomorrow I'll do a massive pr
print(json.dumps(resp)), if you want to json.dumps it, at least indent=4 or 2
Pretty sure asyncio is an unused import in this case
Dont print, use logging
yeye
and wheres your setup function... test the cog first please
Should I use the JS library or keep using snekfetch?
JS lib uses snekfetch
If I'm lazy I'll keep using snekfetch because it's already implemented.
It looks messy and I'm doing a cleanup of my code.
I'd keep bulk down and do it yourself
and don't provide a static number to the API in the function, use len(self.bot.guilds) and your class funcs should, and must have self as a parameter
function updateDbotsStatus() {
require('snekfetch').post(`https://discordbots.org/api/bots/291650980578197506/stats`)
.set('Authorization', configuration.apiKeys.discordbots.key)
.send({server_count: client.guilds.size, shard_id: client.shard.id, shard_count: client.shard.count}).catch(console.log) // eslint-disable-line camelcase
.then(console.log('Updated discordbots.org status.')).catch(console.log); // SEND!;
log('Not updating DBots');
}
@calm torrent can you pr all that? Or open an issue? So it's like all in one place?
allow session, timeout and loop as a kwarg to the init of Client
Also I have setInterval(updateDbotsStatus, 15 * 1000 * 60);
.then(console.log()) doesn't work intentionally
im looking to pr tonight, if you feel it's too late, then ill make an issue now
I'd issue now with the list so others can work on it
ok then
And then pr if nobody else has later ๐๐ป
it's 6am now haha
My server count being "automagically" posted to the api sounds nice.
Appreciated.
Commented on ๐๐ป
discordie isnt supported as the lib's most likely dead. You can use the postStats function
I upvoted my Bot 5 secs ago.
Why the Votes with ?days=1 are empty?
becuase nobody voted today
@calm torrent I did
And my friend too
did you remove and add it again?
like
it was already upvoted
then you removed and added to test?
There was never a removal of a vote today
Can you not ghost ping people just cause they didn't reply? It's not nice and frankly quite rude smh.
Sorry ๐ฌ
But now it works after some 502..
Is the .hasVoted() method asynchronous on Node.js?
I think the days param may be borked
the results im getting feel more like minutes than days tbh
did a call with days=1, got 2 ids, took note of them
did some other stuff for a few minutes
doing the call again -> empty array / other ids
doing the call with days = 5 -> those 2 ids still not there
doign the call with days = 10 -> ids are in the array
also onlyids=false is ignored
Looks like days = minutes?
it doesnt matter what is put for onlyids=, as soon as that parameter is in the query, it returns only ids
iirc when that was added it'd do that
@summer oracle it actually specified that in teh old docs
so is the days field going to be updated to actual days, or stay as minutes
can be minutes for all I care, but then pl0x more than 31 ๐
could there be something to see if a user voted today or not? maybe a boolean thing in the votes api for each member?
Don't think so, but it seems like it would be a good idea to include the date that the votes were added, as well as how many days ago, for easy reference
Hey, not sure why this doesn't work https://gyazo.com/2cb372a45ec3f617a101ac97036883ba
i know the way to get the total amount of upvotes all time but is there a way to get just this month count?
?days=30
if it would work I'll fix it soon
I think I know what went wrong
and if you do ?onlyids=false it'll be 'false' which is actually true lol
smh tonk
smh js
is only allowing users to claim daily credits/money for the bot if they upvote it considered abuse?
@wintry turtle no, in matter of fact theyโre almost promoting
but yeah thatโs what iโm gonna do, thatโs why iโm trying to figure out the days thing
ok, thanks!
np
fixes published
@manic bough The PY wrapper has a lot of issues, import dbl should work but the wrapper has quite a bit of bad code
gonna create a pr later
Where do I put the token on the API?
are you using a library?
Nope
the authorization header
smh I just realized @cobalt ruin didn't include anything about the things being promises
My bot's made in Discord Bot Maker so I don't really know exactly how it works.
Nvn.
Nvm
ew superagent
Use snekfetch lol zero deps
assuming you're using discord.js
snekfetch is a standalone package
yeah, but it's a dep if you aren't using discord.js
It's still a dep even if you are using it if you're on npm 5+ iirc
But snekfetch has zero dependencies
Super agent requires an additional 10 packages to function
oh that's what you meant
fair, although you could take it a step further and just use https
But what if you're not using node 
use whatever way your language has of accessing the command line and curl it
:^)
getting kinda off topic now though, shhh
what's new?
this channel
correct, do you need anything or
well... I love the new ratelimit, and about the new libs, add em' to bot profiles (https://gyazo.com/39e003fb2628c83afb4299349041a166)
that's all
I guess 
what's the new ratelimit? is it still at 60 stats posts/minute and a hour block if you go against it?
this is 60 per minute and it was 10 per minute
god bless you Tonkku
or oliy
or both 
any ideas?
this isn't working
do onlyids=true
afaik it doesnโt need a value
well idk it worked for me adding true so ยฏ_(ใ)_/ยฏ
Maybe oliy fixed it
afaik it never needed a value, but it just checks if onlyids is here iirc
=1 works I think
with the global ratelimits in place, what about having a developer key? I dont want to accidently trigger the ratelimit of a production bot while developing. an additional key, that has access to the data of all bots of a developer, would be really dope.
ยงeval dbl.getStats("373950085609816074").then(stats => message.reply(stats.server_count))
This works to get server count but what if I want to get the full stats Object
just message.reply(stats) doesnt work
ratelimits are per ip not per token
This may be problematic if someone has a few bots
and they host it on a single server
What does my issue has to do with ratelimits 
He was answering Napster
@arctic arch Sorry to bother you, but is there anyone currently working on a C#/.Net wrapper for the API?
wait wait wait what
so we can abuse the hell of /users/* as much as we want?
Or the ratelimit thingy is poorly written
You obviously can't abuse the api as much as you want 
well it doesnt state any ratelimit for /users/ ๐
it doesn't state it but it's common sense isn't it ๐
โข Fixed two grammar mistakes in the API docs
well then, there is this one as well 
and the missing full stop at the bottom
Suggestions, please make the ratelimits per token. imo that's how they should work, not per ip.
I have quite a few bots on one server, so i could quite easily hit it.
+1 because the server Modulo runs on is a shared IP with a few other people (private host but a single IP). Not like we'll hit the limit but just for shits and giggles if any other people get added and end up causing problems
Is there anyway to import a part of the API to either a html or php code, so it will use the api to show how many servers the bots on? I have the api link: https://discordbots.org/api/bots/376359135794561024/stats?server_count ?
^Is the api using json?
yes
like any other rest api
Okay, I understand now ๐
@restive otter the problem with that is that some endpoints are unauthenticated
Do a separate limits for auth'ed ones
Well, use an ip ratelimit for those unless an authorisation header is sent
yeah maybe
It would be great if the amount of requests you have left until you get ratelimited is returned to you.
Preferably as a header, so
x-ratelimit-left: 42
x-ratelimit-reset: unix timestamp for the next minute
Because if it were a json field, it could mess with the API wrappers etc
@golden wind Hey, the example of the python api is missing the self parameter in all functions including the constructor 
ye ik its been reported
ok ๐
@golden wind And the 'r' of this pip install -R requirements.txt should be lower case
๐
@golden wind Sorry for mentioning again, but is it normal that my python is accepting the module name dbl, but not dblpy? ๐
um, its been reported already, idk whats causing it
Ok .. ๐
i'll look into it
future: <Task finished coro=<update() done, defined at C:/Users/merli/PycharmProjects/embed_generator_rewrite/run.py:8> exception=TypeError("__init__() missing 1 required positional argument: 'message'",)>
Traceback (most recent call last):
File "C:/Users/merli/PycharmProjects/embed_generator_rewrite/run.py", line 15, in update
print(str(await dbl_stats.post_guild_count(10)))
File "C:\Users\merli\PycharmProjects\embed_generator_rewrite\dbl_stats.py", line 11, in post_guild_count
await dbl_client.post_server_count(id=botid, token=dbl_token, guild_count=count)
File "C:\Users\merli\AppData\Local\Programs\Python\Python36-32\lib\site-packages\dbl\client.py", line 77, in post_server_count
await self.http.post_server_count(id, token, guild_count, shard_count, shard_no)
File "C:\Users\merli\AppData\Local\Programs\Python\Python36-32\lib\site-packages\dbl\http.py", line 114, in post_server_count
await self.request('POST', f'{self.BASE}/bots/{id}/stats', json=payload)
File "C:\Users\merli\AppData\Local\Programs\Python\Python36-32\lib\site-packages\dbl\http.py", line 78, in request
raise Unauthorized(data.pop('message', 'unknown'))
TypeError: __init__() missing 1 required positional argument: 'message'```
Im getting this when im trying to post the server_count. I think its already reported too? ๐
@golden wind
that one wasn't


yeah my bad