Your upvotes, from your bot
Two things: how many upvotes your app has, and whether a particular person is one of them. Free, and you already have an account.
Your apps
Sign in and your listings appear here with their live upvote counts, which is exactly what the API returns.
Sign in with Telegram to see yours.
Sign inYour keys
Sign in with Telegram to create a key.
Sign inWhy use it
Upvotes are the ranking on miniapps.me, and the top of that ranking gets posted to our channel every month. This turns that from something that happens to you into something you can ask for, inside the bot people are already using.
- It is your own audience
- The people already in your bot are the ones most likely to back it, and nobody can reach them as easily as you can.
- You can give something back
- Because you can check who upvoted, you can unlock something for them rather than asking and hoping.
- It costs nothing
- No plan, no billing, no approval. Verify your listing and create a key.
What you can build
Three things people do with it, and what each one looks like in the chat.
Add it to your task list
If your bot already has quests or daily tasks, this becomes one of them. Your bot checks and ticks it off on its own, so nobody has to send you a screenshot.
Daily tasks
✓ Join the channel
✓ Invite a friend
Upvote us on miniapps.me +50
Unlock something for backers
Gate a feature, a bonus, or a role behind an upvote. People who have already upvoted never see the prompt at all.
Pro filters are open to anyone backing the bot.
One tap, then come straight back here.
Show your score in the bot
Pull your live count into a welcome message or a stats command. It is proof, and it makes people want to add to it.
Welcome back.
84 people back us on miniapps.me
Ranked #6 in Crypto this month.
Get a key
- 1Sign in with Telegram. You probably already have.
- 2Verify your listing. Open it from your profile and paste your bot token. That proves the bot is yours.
- 3Create a key in Your keys below. It is shown once, so copy it.
A key only answers for listings you own and have verified. Without that, a key would be a way to find out whether a named person upvoted a named bot.
How to use it
Send your key in the Authorization header, which is the only place we accept it. Two endpoints, both GET.
GET /api/v1/apps
Your apps, their current upvote counts, and a picture you can use in your own messages. icon is an absolute URL and is null only if a listing has no logo.
{
"apps": [
{
"app": "yourbot",
"name": "Your Bot",
"icon": "https://miniapps.me/apps/logos/yourbot.jpg",
"url": "https://miniapps.me/yourbot",
"votes": 84
}
]
}
GET /api/v1/upvoted
Whether one person has upvoted you. Pass
?app=yourbot&user=123456789.
{
"user": 123456789,
"upvoted": true,
"since": "2026-05-25",
"app": "yourbot",
"icon": "https://miniapps.me/apps/logos/yourbot.jpg",
"votes": 84
}
When they have not upvoted, since comes back
null and you get a link to send them:
{
"user": 123456789,
"upvoted": false,
"since": null,
"app": "yourbot",
"icon": "https://miniapps.me/apps/logos/yourbot.jpg",
"votes": 84,
"vote_url": "https://miniapps.me/v/yourbot"
}
Send that link as a button with their id on the end,
?r=123456789. They tap once, and Telegram returns them to your chat as
/start v_123456789, which is where you mark the task done.
If something goes wrong
Every failure is JSON with an error code and a
message written for a person.
401 | no_key, bad_key. Missing, wrong, or revoked. |
403 | not_yours. That app is not one of yours. The reply lists the ones that are. |
400 | no_app, no_user, bad_user. Something is missing or is not a number. |
429 | rate_limited. Wait a second and retry. |
import requests
KEY = "ma_live_your_key_here"
APP = "yourbot"
USER = 123456789
r = requests.get(
"https://miniapps.me/api/v1/upvoted",
params={"app": APP, "user": USER},
headers={"Authorization": f"Bearer {KEY}"},
).json()
print(r["upvoted"]) # True or False
print(r["votes"]) # 84
const KEY = "ma_live_your_key_here";
const APP = "yourbot";
const USER = 123456789;
const r = await fetch(
`https://miniapps.me/api/v1/upvoted?app=${APP}&user=${USER}`,
{ headers: { Authorization: `Bearer ${KEY}` } }
).then((res) => res.json());
console.log(r.upvoted); // true or false
console.log(r.votes); // 84
curl -H "Authorization: Bearer ma_live_your_key_here" \
"https://miniapps.me/api/v1/upvoted?app=yourbot&user=123456789"
Limits
The per-second cap is there to stop a broken retry loop, not to meter
you. Go over and you get a 429, then you are fine again a second later.
Ask, do not buy. Gating something behind an upvote is fine. Paying per upvote is not. We log the address behind every vote, and farmed votes get removed along with the listing that farmed them.