Riftbound API: Real-Time Card Prices from TCGplayer & CardMarket (2026)
Riftbound API guide: free card database endpoints, TCGplayer and CardMarket prices with Ultra, and real JSON responses with JavaScript and Python examples.

Riftbound API: Real-Time Card Prices from TCGplayer & CardMarket (2026)
🔵 IN THIS GUIDE: How to pull Riftbound card data and TCGplayer + CardMarket prices from the PokéWallet API, using real responses captured on October 13, 2026. The catalog is free on every plan. Prices and analytics need Ultra or the 7-day trial, and Pro does not cover them.
Quick Answer: The PokéWallet API serves Riftbound under
https://api.pokewallet.io/rft/…, covering 15 sets. Sets, cards, search and images are free, including on the free tier (100 requests/hour, 1,000/day, no credit card). Prices and analytics (bulk set prices, set statistics, completion value, trending sets, top cards) require the Ultra plan at €29/month or the 7-day trial. Pro is not enough. Prices come from TCGplayer (USD) and CardMarket (EUR) and refresh once a day. The same API key also covers 11 other card games.
Riftbound is new, and its developer tooling is still catching up. Anyone building a deck tracker, a collection app or a price bot for the League of Legends TCG hits the same problem quickly. Card text is easy to find. Clean, structured market prices from both major marketplaces are not. That gap is the reason this API exists.
This guide shows the Riftbound endpoints exactly as they respond today. Every JSON sample comes from a live call made on October 13, 2026, and so does every field name and number. We start with the free catalog and then move to the Ultra price and analytics endpoints. Next come JavaScript and Python code you can paste in, and the edge cases that tend to break a first integration: negative set IDs, numbers sent as strings, HTML inside card text, and two different products that share one name.
If you've used our One Piece endpoints, this will look familiar. The shape matches the One Piece Card Game API guide with a different path prefix.
Key Takeaways
- 🆓 The catalog is free.
/rft/sets,/rft/sets/:set,/rft/cards/:id,/rft/searchand/rft/images/:idwork on every plan, including the free tier. - 💰 Prices and analytics need Ultra.
/rft/prices/:set, statistics, completion value, trending and top cards are Ultra-only (€29/month) or available on the 7-day trial. Pro unlocks only Pokémon and One Piece. - 🔁 Prices refresh daily, not by the second.
updated_atis the time of the last price change, so a cheap common can show a timestamp that is weeks old and still be current. - 🧮 Showcase cards are nearly all of Vendetta's cost. Of the $14,436.01 TCGplayer market estimate for a complete set, $14,335.93 comes from the 68 Showcase cards.
- 🆔 Key on
id, never onname. "Teemo - Scout" shows up in two different promo sets with opposite price moves in the same week. - 🔤 Expect strings and nulls.
mightandenergy_costarrive as strings,domaincan be"Mind;Chaos",set_idcan be"-1", andrelease_datecan benull. - 📉 No price history for Riftbound. History is Pokémon-only. The trending endpoint gives you a 7-day CardMarket change, and its TCGplayer side currently reports
work_in_progress. - 🔑 One key, 12 games. The key you create for Riftbound also reads Pokémon, One Piece, Magic, Yu-Gi-Oh!, Lorcana and six more games.
⚡ Quick Navigation
What the API Covers
Riftbound uses the game code rft. Every Riftbound endpoint sits under https://api.pokewallet.io/rft/. The sets endpoint reported 15 sets on October 13, 2026 ("total": 15).
Those 15 entries include more than the main expansions. Promotional sets, Organized Play prize cards and upcoming products are all in there. Two entries from the live response show how wide the range is:
| Set | set_code | set_id | Cards | Sealed | Release date |
|---|---|---|---|---|---|
| Legacy | LGC | 24832 | 0 | 7 | 2027-01-29 |
| Nexus Night Promos | nnp | -2 | 1 | 0 | null |
Legacy is listed three months before its release with 7 sealed products and zero cards. Sealed SKUs appear in the catalog first, and the card list follows later. If you're building a release tracker, watch card_count move off zero. Nexus Night Promos shows two more things your code has to accept: set_id can be negative, and release_date can be null.
For every card you get the usual catalog fields (name, set_code, card_number, rarity, card_type, variants, card_text) plus a set of Riftbound-specific fields:
| Field | Example value | Notes |
|---|---|---|
domain | "Fury", "Mind;Chaos" | Multi-domain cards are semicolon-separated |
might | "6" | String, not integer |
energy_cost | "6" | String |
power_cost | "0" | String; not present on every card |
tag | "Shurima", "Teemo" | Region or champion tag |
flavor_text | — | Listed among the game's fields; not in today's samples |
Prices come from two sources: TCGplayer in USD and CardMarket in EUR, refreshed once a day. CardMarket prices are split by finish (normal, foil). There's no eBay data and no grading data (PSA, CGC). For how the two marketplaces differ for buyers and sellers, our TCGplayer vs CardMarket vs eBay comparison covers it from the One Piece side, and the same logic applies here.
Your First Request
Create a free account at /auth/login and copy your key from the dashboard. Every request sends it in the X-API-Key header:
curl -H "X-API-Key: YOUR_API_KEY" \
"https://api.pokewallet.io/rft/search?q=Sandspinner"
This is the response we got (card text trimmed for space):
{
"query": "Sandspinner",
"results": [
{
"id": "rft_bf4eaca8debd7fa56f0cf4cf7ee347989cdeaf71595032dfa475d03388a39904bd977d9707ddc662c47db3b6c36f",
"card_info": {
"name": "Baccai Sandspinner",
"set_name": "Vendetta",
"set_code": "VEN",
"set_id": "24698",
"card_number": "001/166",
"rarity": "Common",
"card_type": "Unit",
"variants": ["Normal", "Foil"],
"tag": "Shurima",
"might": "6",
"domain": "Fury",
"energy_cost": "6"
},
"tcgplayer": {
"prices": [
{ "sub_type_name": "Normal", "market_price": 0.05, "low_price": 0.01,
"mid_price": 0.15, "high_price": 2.47, "direct_low_price": null,
"updated_at": "2026-09-20T12:34:15.413415+00:00" },
{ "sub_type_name": "Foil", "market_price": 0.13, "low_price": 0.03,
"mid_price": 0.24, "high_price": 4.99, "direct_low_price": null,
"updated_at": "2026-09-30T20:41:23.09906+00:00" }
],
"url": "https://www.tcgplayer.com/product/707613/riftbound-league-of-legends-trading-card-game-vendetta-baccai-sandspinner"
},
"cardmarket": {
"product_name": "Baccai Sandspinner",
"prices": [
{ "variant_type": "normal", "avg": 0.08, "low": 0.02, "trend": 0.05,
"avg1": 0.17, "avg7": 0.06, "avg30": 0.04,
"updated_at": "2026-09-30T14:50:06.98989+00:00" },
{ "variant_type": "foil", "avg": 0.08, "low": 0.02, "trend": 0.12,
"avg1": 0.05, "avg7": 0.1, "avg30": 0.14,
"updated_at": "2026-09-30T14:50:06.98989+00:00" }
],
"product_url": "https://www.cardmarket.com/en/Riftbound/Products/Singles/Vendetta/Baccai-Sandspinner"
}
}
],
"metadata": {
"total_count": 1, "tcg": 1, "cardmarket": 1,
"tcg_only": 0, "cardmarket_only": 0, "both_sources": 1, "truncated": false
}
}
Three details to note before you go further:
- The
idis the stable key. It's long, and Riftbound card IDs start withrft_. Store it and use it for everything. - TCGplayer and CardMarket don't share a schema. TCGplayer uses
sub_type_name("Normal"/"Foil") withmarket_price. CardMarket usesvariant_type("normal"/"foil", lower case) withtrendand rolling averagesavg1,avg7,avg30. Normalize the case before you join the two. metadatatells you source coverage.both_sources: 1means the card matched on both marketplaces. Usetcg_onlyandcardmarket_onlyto spot cards that only one side lists.
Free Endpoints
All five catalog endpoints work on every plan. On the free tier you get 100 requests/hour and 1,000/day, enough to build and test a full integration.
| Endpoint | What it returns |
|---|---|
GET /rft/sets | All Riftbound sets with set_code, set_id, card_count, sealed_count, release_date |
GET /rft/sets/:set | One set's details plus a paginated card list |
GET /rft/cards/:id | One card with full card_info, TCGplayer and CardMarket blocks |
GET /rft/search?q= | Name search across all Riftbound sets |
GET /rft/images/:id | Card image |
The set endpoint takes either the set_code or the numeric set_id: /rft/sets/VEN and /rft/sets/24698 both return Vendetta. If a set_code is shared by several sets, the API answers with the candidates instead, so store the set_id. The response opens with a set object ("total_cards": 260, release date July 31, 2026), followed by cards and a pagination block (page, limit, total, total_pages). For the paging query parameters, see the Riftbound API documentation.
One detail here causes confusion: in the set card list, the prices arrays come back empty. Each card has its tcgplayer.url and cardmarket.product_url, but no numbers. That's by design. Bulk prices for a whole set come from /rft/prices/:set, which is an Ultra endpoint. Don't loop /rft/cards/:id across 260 cards to rebuild that feed. It would use a quarter of your daily free quota on one set.
Watch the card_text field when you render cards. It contains raw HTML (<em>, <br>) and Windows line breaks (\r\n). Sanitize it before it reaches the DOM. Promo cards can also include a disclaimer inside a <span style="color: red;">.
Ultra Endpoints: Prices & Analytics
These five endpoints need Ultra (€29/month, 7,000 requests/hour, 70,000/day) or the 7-day trial, which you start from the dashboard after you log in. Pro only unlocks Pokémon and One Piece, so it won't work here. All figures below were captured on October 13, 2026.
GET /rft/prices/:set: bulk set prices
/rft/prices/24698 returns one row per card per variant, with TCGplayer and CardMarket side by side ("source": "both"). For Vendetta that came to "total": 360 rows. Baccai Sandspinner shows up twice, once as "variant": "Normal" (TCGplayer market $0.05, CardMarket trend €0.05) and once as "Foil" ($0.13 / €0.12). Use this endpoint for nightly syncs, because one call replaces hundreds.
GET /rft/sets/:set/statistics
The Vendetta summary:
| Metric | TCGplayer (USD) | CardMarket (EUR) |
|---|---|---|
| Average price | $58.84 | €34.59 |
| Cheapest card | $0.08 | €0.04 |
| Most expensive | $3,229.71 | €2,516.75 |
| Top card | Akali, Rogue Assassin (Signature) | Akali, Rogue Assassin (Signature) |
| Trend | — | up |
The rarity breakdown: 58 Common, 46 Uncommon, 46 Rare, 28 Epic, 68 Showcase. The average price is pulled up by the Showcase tier, so don't treat it as the price of a typical card.
GET /rft/sets/:set/completion-value
This is what one copy of every Vendetta card costs at base finish:
| Source | Low | Market / Avg | High / Trend |
|---|---|---|---|
| TCGplayer (USD) | $13,385.72 | $14,436.01 (market) | $41,697.43 (high) |
| CardMarket (EUR) | €8,570.56 | €9,669.26 (avg) | €5,496.27 (trend) |
The rarity breakdown adds up exactly to the TCGplayer market estimate:
| Rarity | Cards | Total cost |
|---|---|---|
| Common | 58 | $5.31 |
| Uncommon | 46 | $4.71 |
| Rare | 46 | $9.93 |
| Epic | 28 | $80.13 |
| Showcase | 68 | $14,335.93 |
Commons through Epics together cost about $100. Showcase is 99.3% of the bill. For collectors, that means the playable set is cheap and the master set is a Showcase hunt. The API itself warns that "Cross-currency comparison not available", so don't convert one column to compare it with the other.
The statistics and completion endpoints count 248 cards, while the set endpoint lists 260. Use the set endpoint for catalog size and the analytics endpoints for the cards that have a price.
GET /rft/analytics/top-cards
With no parameters, it ranks by TCGplayer price across all of Riftbound:
| Card | Set | Price |
|---|---|---|
| Teemo, Swift Scout (Metal) (Prize Wall) | Organized Play Promotional Cards | $4,400.00 |
| Ahri, Nine-Tailed Fox (Signature) | Origins | $3,624.82 |
With ?metric=growth&source=cm, it ranks by 7-day CardMarket growth:
| Card | Set | Price | 7-day change |
|---|---|---|---|
| Altar to Unity | Promos | €759.29 | +104.7% |
| Teemo - Scout | Promos | €1,922.11 | +102.9% |
Those growth entries come back with rarity: null, card_type: null, empty variants, and IDs without the rft_ prefix. They're CardMarket-side products, so your code must handle missing metadata.
GET /rft/sets/trending
This endpoint reports set-level movement over "period": "7d", from CardMarket:
| Set | Change | Avg now | Avg before | Top movers |
|---|---|---|---|---|
Riftbound Promotional Cards (PR) | −7.8% | €41.28 | €44.78 | Ahri - Alluring −25.9%, Teemo - Scout −21.4% |
Promos (promo-rift) | +2.3% | €22.35 | €21.85 | Bird // Sprite +29.1%, Sprite // Bird +24.4% |
The TCGplayer side returns "status": "work_in_progress" with the message "TCGPlayer price history not yet available" on the first set, and null on the second. Code for both cases.
There's also a trap here. In the same week, "Teemo - Scout" is up 102.9% in the growth ranking (set promo-rift) and down 21.4% among trending movers (set PR). These are different products in different sets. An app that keys on card name would merge them into nonsense, which is why you key on id.
Code Examples: JavaScript & Python
Both examples read the key from an environment variable and only use fields that appear in the responses above. The documentation also includes Node.js and Go snippets. There's no official SDK, so you call the endpoints over plain HTTP.
JavaScript: search a card and compare both marketplaces
const BASE_URL = "https://api.pokewallet.io";
const API_KEY = process.env.POKEWALLET_API_KEY;
if (!API_KEY) throw new Error("Missing POKEWALLET_API_KEY");
async function api(path) {
const res = await fetch(`${BASE_URL}${path}`, {
headers: { "X-API-Key": API_KEY },
});
if (!res.ok) {
throw new Error(`GET ${path} failed: ${res.status} ${await res.text()}`);
}
return res.json();
}
async function comparePrices(query) {
const { results } = await api(`/rft/search?q=${encodeURIComponent(query)}`);
return results.map((card) => {
const tcg = card.tcgplayer?.prices ?? [];
const cm = card.cardmarket?.prices ?? [];
// TCGplayer uses "Foil", CardMarket uses "foil": normalize before joining
const variants = card.card_info.variants.map((variant) => {
const t = tcg.find((p) => p.sub_type_name === variant);
const c = cm.find((p) => p.variant_type === variant.toLowerCase());
return {
variant,
tcgplayerMarketUsd: t?.market_price ?? null,
cardmarketTrendEur: c?.trend ?? null,
};
});
return {
id: card.id,
name: card.card_info.name,
set: card.card_info.set_code,
might: Number(card.card_info.might), // sent as a string
variants,
};
});
}
comparePrices("Sandspinner")
.then((rows) => console.log(JSON.stringify(rows, null, 2)))
.catch((err) => console.error(err.message));
For Baccai Sandspinner this prints the Normal variant at $0.05 / €0.05 and the Foil at $0.13 / €0.12.
Python: what does a full set cost? (Ultra)
import os
import requests
BASE_URL = "https://api.pokewallet.io"
API_KEY = os.environ.get("POKEWALLET_API_KEY")
if not API_KEY:
raise SystemExit("Missing POKEWALLET_API_KEY")
def api(path: str) -> dict:
res = requests.get(f"{BASE_URL}{path}", headers={"X-API-Key": API_KEY}, timeout=15)
res.raise_for_status()
return res.json()
def completion_report(set_id: str) -> None:
data = api(f"/rft/sets/{set_id}/completion-value")
tcg = data["completion_cost"]["tcgplayer"]
cm = data["completion_cost"]["cardmarket"]
breakdown = data["breakdown_by_rarity"]
total = sum(r["total_cost"] for r in breakdown.values())
print(f"{data['set_info']['name']} — {data['set_info']['total_cards']} cards")
print(f"TCGplayer market: {tcg['market_estimate']:,.2f} {tcg['currency']}")
print(f"CardMarket avg: {cm['avg_estimate']:,.2f} {cm['currency']}")
for rarity, row in breakdown.items():
share = row["total_cost"] / total * 100 if total else 0
print(f" {rarity:<10} {row['count']:>3} cards {row['total_cost']:>10,.2f} ({share:.1f}%)")
if __name__ == "__main__":
try:
completion_report("24698") # Vendetta
except requests.HTTPError as err:
print(f"Request failed: {err}")
Running this against Vendetta reproduces the table in the previous section, including Showcase at 99.3%. For a full tracker with storage and alerts, the BerryWallet price tracker tutorial walks through the architecture. Swap /op/ for /rft/ and the pattern carries over.
How It Compares to the Alternatives
Riftbound is young, and the API ecosystem around it is thin. Community deckbuilders and card databases have card text and images, and several of them do it well. If all you need is rules text for a deckbuilder, one of them may be enough.
Developers usually end up choosing between three approaches:
- A community card database for catalog data. This works if you don't need prices, and you depend on how long someone's side project stays maintained.
- Scraping marketplace pages for prices. This is brittle, often against terms of service, and breaks the next time a page changes. You'd also be doing it twice, once for TCGplayer and once for CardMarket.
- A priced API, which is where PokéWallet fits.
Here's what we offer and what we don't. You get both marketplaces in one response, normalized per variant, with set-level analytics ready-made, and the catalog is free. You don't get price history for Riftbound, eBay sold listings, graded prices, or intraday updates. If your product needs any of those, we're not the right tool today.
Our real advantage isn't Riftbound on its own. It's that the same key reads 12 games: Pokémon, One Piece, Magic: The Gathering, Yu-Gi-Oh!, Lorcana, Flesh and Blood, Dragon Ball Super, Digimon, Star Wars Unlimited, Cardfight!! Vanguard, Riftbound and Cyberpunk. For Magic or Yu-Gi-Oh! alone, mature single-game sources like Scryfall and YGOPRODeck are strong, and many developers use them for card data. If your app or shop handles several games, one schema and one bill beat running five integrations. For how multi-source apps are usually structured, see our architecture guide for TCG collection apps.
Frequently Asked Questions
Is there a Riftbound API?
Yes. PokéWallet serves Riftbound at https://api.pokewallet.io/rft/ with sets, cards, search and images, plus TCGplayer and CardMarket prices. It covered 15 sets as of October 13, 2026, including promos and sealed products for upcoming sets. Full reference: Riftbound API documentation.
Is the Riftbound API free?
The catalog is free: sets, cards, search and images, on the free tier with 100 requests/hour and 1,000/day and no credit card. Bulk prices, set statistics, completion value, trending sets and top cards need Ultra (€29/month) or the 7-day trial.
Does the Pro plan include Riftbound prices?
No. Pro (€20/month) unlocks the paid endpoints for Pokémon and One Piece only. Riftbound and the other nine games need Ultra, which also includes everything in Pro.
How do I get Riftbound card prices from TCGplayer and CardMarket?
Call /rft/prices/:set with your set's set_id (for example 24698 for Vendetta) and an Ultra or trial key. Each row has a tcgplayer block in USD and a cardmarket block in EUR for one variant (Normal or Foil). The plan details are on the pricing page.
How often are Riftbound prices updated?
Once a day, for both TCGplayer and CardMarket. The updated_at field shows when a price last changed, not when it was last checked, so a stable common can carry a timestamp several weeks old.
Does the API have Riftbound price history?
No. Price history is Pokémon-only. For Riftbound you can use CardMarket's rolling averages (avg1, avg7, avg30) on each card and the 7-day changes from /rft/sets/trending and /rft/analytics/top-cards?metric=growth.
What is the most expensive Riftbound card right now?
In our October 13 data, the top TCGplayer card was Teemo, Swift Scout (Metal) (Prize Wall) at $4,400, followed by Ahri, Nine-Tailed Fox (Signature) at $3,624.82. Within Vendetta, Akali, Rogue Assassin (Signature) leads at $3,229.71 on TCGplayer and €2,516.75 on CardMarket.
Does it include eBay or PSA graded prices?
No. The only sources are TCGplayer and CardMarket, and there's no grading data from PSA, CGC or anyone else.
💬 Price disclaimer: All prices and statistics in this article come from live PokéWallet API responses captured on October 13, 2026, and are sourced from TCGplayer (USD) and CardMarket (EUR). Individual price timestamps range from September 20 to September 30, 2026. Card prices change daily, and this is not financial advice.
Start Building with the PokéWallet API
Everything in this guide (the Vendetta completion cost, the Teemo name collision, the side-by-side marketplace prices) came from a few calls with one key. Start on the free catalog, and turn on the 7-day trial when you're ready to work with prices.
- 🔑 One API key for 12 trading card games — Pokémon, One Piece, Magic, Yu-Gi-Oh!, Lorcana, Riftbound and more
- 💰 TCGplayer (USD) and CardMarket (EUR) prices, refreshed daily
- 🆓 Catalog endpoints free on every plan — sets, cards, search and images
- ⚡ Ultra unlocks prices and analytics for every game — try it free for 7 days from your dashboard
- 💬 Developer support in our Discord
Get Started:
- 🚀 Get Your Free API Key — no credit card required
- 📖 Read the API documentation
- 💳 Compare plans on the pricing page
This article is for informational purposes only and is not financial advice. Details reflect information available at the time of writing; release dates, pricing and set contents are subject to change. Card prices are volatile — always verify current market pricing before buying or selling.