API

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.

Your keys

Why 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

Upvote and claim

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.

Unlock pro filters

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

  1. 1
    Sign in with Telegram. You probably already have.
  2. 2
    Verify your listing. Open it from your profile and paste your bot token. That proves the bot is yours.
  3. 3
    Create 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.

401no_key, bad_key. Missing, wrong, or revoked.
403not_yours. That app is not one of yours. The reply lists the ones that are.
400no_app, no_user, bad_user. Something is missing or is not a number.
429rate_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

Limits

20requests a second
Freeno plan, no billing
10keys per account
no monthly cap

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.