If you run a Discord price bot, TickerMint gives you the latest TCGplayer market price of every Pokemon, One Piece, Lorcana, Riftbound, Gundam and Yu-Gi-Oh card from two keyless calls: search for the card (GET https://api.tickermint.cards/products/search), then read its price as one CSV row that includes the card page link your bot posts back, with daily history back to February 8, 2024 (Riftbound since October 2025, Gundam since February 2025, Yu-Gi-Oh since September 2026) when you want charts.
Card price API for Discord price bots
A !price COMMAND
discord.py with aiohttp. Type !price charizard ex 199/165 in a channel; the bot answers with the market price and the TickerMint card page link.
import os
import aiohttp
import discord
API = "https://api.tickermint.cards"
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)
@client.event
async def on_message(message):
if message.author.bot or not message.content.startswith("!price "):
return
q = message.content.removeprefix("!price ").strip()
async with aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=10)) as http:
async with http.get(f"{API}/products/search", params={"q": q}) as r:
hits = await r.json()
if not hits:
await message.channel.send(f"No card found for {q}")
return
pid = hits[0]["product_id"]
# one CSV row: date, product_id, name, set, number, printing, market_price_usd, url
async with http.get(f"{API}/products/{pid}.csv") as r:
row = (await r.text()).strip().split("\n")[1].rsplit(",", 2)
head, price, url = row
shown = f"${price} TCGplayer market" if price else "no recent price"
await message.channel.send(f"{hits[0]['name']} ({hits[0]['set_name']}): {shown}\n{url}")
client.run(os.environ["DISCORD_TOKEN"])A WEEKLY MOVERS POST
The biggest risers and fallers of the week in one game, ready to post on a schedule.
import requests
API = "https://api.tickermint.cards"
# This week's biggest movers in one game, for a weekly post in your server
movers = requests.get(f"{API}/desk/movers", params={"game": "one-piece", "days": 7, "limit": 5}, timeout=10).json()
for m in movers:
print(m["name"], m["market"], f"{m['pct_change']:+.0%}", f"https://tickermint.cards/card/{m['product_id']}")Free with no key for personal and non-commercial projects, with a link back. Inside a commercial app, site or tool, use API Pro ($49 a month). Plans →
THE PLAN THAT FITS
Free · $0
A community or hobby bot that posts the link back: no key, no account.
- 120 requests a minute per IP, no key
- Personal projects, research, hobby and non-commercial bots
API Pro · $49/mo
A bot you sell, or one that is part of a paid server or service, is commercial use.
- 1,200 requests a minute
- Commercial license: show prices and history inside your app, site or tool
Every plan side by side, terms and checkout on /developers.
Tell us what you are building and your budget. We reply within a day with the plan that fits, and can set up a 14-day trial key.
QUESTIONS
Is it free for a Discord bot?
+×
Yes for hobby and non-commercial bots, with no key, as long as each answer links to the TickerMint page the price came from (the url column in the CSV row). A bot you sell or run as part of a paid service needs API Pro, $49 a month, 1,200 requests a minute. No plan allows reselling the raw prices as a dataset or feed, or building a competing price API on them.
How many requests can my bot make?
+×
120 a minute per IP with no key, lower on search. Every answer is cached for up to an hour and prices change once a day, so caching search results and prices in the bot keeps a busy server well under the limit.
Which games can the bot price?
+×
Pokemon, One Piece, Lorcana, Riftbound, Gundam and Yu-Gi-Oh. Add game=one-piece (or lorcana, riftbound, gundam, yugioh) to the search call to keep a game's server to its own cards.
Built for: Price trackers and alert apps · Store repricing and buylists · Collection and portfolio apps · Deck builders and deck cost tools · Google Sheets · Excel · API, MCP server and embeds