PokéWallet API
Documentation
Complete REST reference for the most comprehensive Pokémon TCG platform. Real-time pricing, 50,000+ cards database, and generous rate limits.
https://api.pokewallet.ioQuick Start
Get started with PokéWallet API in 3 simple steps:
Generate an API Key
Create your first API key from the dashboard.
Make Your First Request
Start querying the API with your key.
curl -H "X-API-Key: pk_live_your_key_here" \
"https://api.pokewallet.io/search?q=charizard"Authentication
All API requests (except /health) require authentication using an API key.
API Key Format
API keys follow this format:
- Production keys:
pk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - Development keys:
pk_test_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Authentication Methods
You can authenticate using either the X-API-Key header or Authorization header:
curl -H "X-API-Key: pk_live_your_key_here" \
"https://api.pokewallet.io/search?q=pikachu"curl -H "Authorization: Bearer pk_live_your_key_here" \
"https://api.pokewallet.io/search?q=pikachu"Rate Limits
Rate limits vary depending on your subscription plan:
| Plan | Hourly Limit | Daily Limit | Price |
|---|---|---|---|
| Free | 50 requests | 100 requests | $0/month |
| Early Access ⭐ | 1,000 requests | 10,000 requests | $0/month |
| Pro | 10,000 requests | 100,000 requests | Contact us |
Rate Limit Headers
Every API response includes rate limit information:
X-RateLimit-Limit-Hour: 1000
X-RateLimit-Remaining-Hour: 945
X-RateLimit-Limit-Day: 10000
X-RateLimit-Remaining-Day: 8234Rate Limit Exceeded (429)
When you exceed your rate limit, you'll receive a 429 Too Many Requests response:
{
"error": "Rate limit exceeded",
"message": "Hourly limit exceeded",
"limits": {
"hourly": {
"limit": 1000,
"used": 1000,
"remaining": 0
},
"daily": {
"limit": 10000,
"used": 5234,
"remaining": 4766
}
}
}Card ID Formats
The API uses two different ID formats depending on the card's data source:
TCG Cards (TCGPlayer)
Format: pk_ + hexadecimal hash
Example:
pk_72046138a4c1908a9f27c93fdd8189ba...Usage: All cards with TCGPlayer data (even if they also have CardMarket data)
CardMarket-Only Cards
Format: Direct hexadecimal hash (no pk_ prefix)
Example:
2208e8a2750c07d89e54870ffcef80d1...Usage: Only cards exclusively from CardMarket (e.g., Japanese sets, European promos)
card_number but different variants (V1, V2, etc.) have unique IDs. Public Endpoints
/healthNo Auth RequiredCheck API status, database, cache, and storage health with response times.
Example Request:
curl "https://api.pokewallet.io/health"Response Example (Healthy):
{
"status": "healthy",
"timestamp": "2025-12-16T10:30:00.000Z",
"version": "1.0.0-beta",
"checks": {
"database": {
"status": "healthy",
"responseTime": 45
},
"cache": {
"status": "healthy",
"responseTime": 3
},
"storage": {
"status": "healthy",
"responseTime": 12
}
},
"responseTime": 60,
"region": "FRA"
}Response Example (Unhealthy):
{
"status": "unhealthy",
"timestamp": "2025-12-16T10:30:00.000Z",
"version": "1.0.0-beta",
"checks": {
"database": {
"status": "unhealthy",
"responseTime": null,
"message": "Connection failed"
},
"cache": {
"status": "healthy",
"responseTime": 3
},
"storage": {
"status": "healthy",
"responseTime": 12
}
},
"responseTime": 1050,
"region": "FRA"
}/No Auth RequiredGet API information, version, and available endpoints.
Example Request:
curl "https://api.pokewallet.io/"Response Example:
{
"name": "PokeWallet API",
"version": "1.0.0-beta",
"status": "beta",
"authentication": {
"required": true,
"method": "API Key",
"header": "X-API-Key",
"format": "pk_live_xxxxxxxxxxxxx"
},
"endpoints": {
"health": {
"path": "/health",
"auth_required": false
},
"search": {
"path": "/search?q=charizard",
"auth_required": true
},
"cards": {
"path": "/cards/:id",
"auth_required": true
},
"images": {
"path": "/images/:id?size=high",
"auth_required": true
}
},
"rate_limits": {
"early_access": {
"per_hour": 1000,
"per_day": 10000
}
}
}Search Endpoints
/searchAdvanced card search with unified pricing from TCGPlayer and CardMarket.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
q | string | Required | Search query (card name, set code, card number, rarity) |
page | number | Optional | Page number (default: 1) |
limit | number | Optional | Results per page (default: 20, max: 100) |
Example Request:
curl -H "X-API-Key: pk_live_your_key_here" \
"https://api.pokewallet.io/search?q=charizard+ex"Response Example (TCG Card):
{
"query": "pikachu",
"results": [
{
"id": "pk_72046138a4c1908a9f27c93fdd8189ba4ac8e683efaed6b9161efcef129302394a9ec1d20d",
"card_info": {
"name": "Pikachu ex (Pikachu 60)",
"clean_name": "Pikachu ex Pikachu 60",
"set_name": "Battle Academy 2024",
"set_code": "23520",
"card_number": "106",
"rarity": "Holo Rare",
"card_type": "Lightning",
"sub_type_name": "Holofoil",
"hp": "200.0",
"stage": "Basic",
"card_text": null,
"attacks": ["[LLC] Thunderbolt (120)"],
"weakness": "Fx2",
"resistance": null,
"retreat_cost": "1.0"
},
"tcgplayer": {
"prices": {
"low_price": 7,
"mid_price": 9.37,
"high_price": 18,
"market_price": 8.01,
"direct_low_price": null,
"updated_at": "2025-12-27T05:14:43.451818"
},
"url": "https://www.tcgplayer.com/product/556443"
},
"cardmarket": null
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 56,
"total_pages": 3
},
"metadata": {
"total_count": 56,
"tcg": 18,
"cardmarket": 38,
"tcg_only": 18,
"cardmarket_only": 38,
"both_sources": 0
}
}Response Example (CardMarket-Only Card):
{
"query": "cubone cbb3c",
"results": [
{
"id": "8eb728bd59d4e1a0d94c354e4cc65a7465b55cfa4261bfa93301faa5ec921f97",
"card_info": {
"name": "Cubone (CBB3C 04)",
"set_code": "CBB3C",
"card_number": "4"
},
"tcgplayer": null,
"cardmarket": {
"product_name": "Cubone (CBB3C 04)",
"prices": [
{
"avg": null,
"low": 0.02,
"avg1": null,
"avg7": null,
"avg30": null,
"trend": 0,
"updated_at": "2025-12-29T04:54:57.728497",
"variant_type": "normal"
},
{
"avg": 0.37,
"low": 0.02,
"avg1": 0.1,
"avg7": 0.35,
"avg30": 0.35,
"trend": 0.29,
"updated_at": "2025-12-29T04:54:57.728497",
"variant_type": "holo"
}
],
"product_url": "https://www.cardmarket.com/en/Pokemon/Products/Singles/Gem-Pack-Vol-3/Cubone-V1-CBB3C04"
}
},
{
"id": "a7ed43b641d4f24b494ad5889845085f33966d1f19cb9e0ed353979025d8da31",
"card_info": {
"name": "Cubone (CBB3C 04)",
"set_code": "CBB3C",
"card_number": "4"
},
"tcgplayer": null,
"cardmarket": {
"product_name": "Cubone (CBB3C 04)",
"prices": [
{
"avg": null,
"low": 0.02,
"trend": 0,
"variant_type": "normal"
}
],
"product_url": "https://www.cardmarket.com/en/Pokemon/Products/Singles/Gem-Pack-Vol-3/Cubone-V4-CBB3C04"
}
}
],
"pagination": {
"page": 1,
"limit": 2,
"total": 7,
"total_pages": 4
},
"metadata": {
"total_count": 7,
"tcg": 0,
"cardmarket": 7,
"tcg_only": 0,
"cardmarket_only": 7,
"both_sources": 0
}
}card_number: "4" and set_code: "CBB3C", but each has a unique ID. This ensures each variant can be uniquely identified and its correct image can be retrieved. /search/by-price-rangeComing SoonSearch cards by price range with optional filters for rarity and set.
⏳ This endpoint is currently in development and will be available soon after thorough testing.
/search/by-typeComing SoonSearch cards by card type (Pokemon, Trainer, Energy) and optional subtype filters.
⏳ This endpoint is currently in development and will be available soon after thorough testing.
Cards Endpoints
X-API-Key header. /cards/:idGet complete card details with unified pricing from TCGPlayer and CardMarket.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Required | Card ID - Two formats supported:
|
set_code | string | Optional | Set code for disambiguation (e.g., "SWSH3", "SV1", "CBB3C"). Supports both alphanumeric codes and numeric group IDs. |
Example Request:
curl -H "X-API-Key: pk_live_your_key_here" \
"https://api.pokewallet.io/cards/pk_xxx"Response Example:
{
"id": "pk_xxx",
"card_info": {
"name": "Charizard VMAX",
"clean_name": "Charizard VMAX",
"set_name": "Darkness Ablaze",
"set_code": "SWSH3",
"card_number": "20/189",
"rarity": "Secret Rare",
"card_type": "Pokemon",
"sub_type_name": "VMAX",
"hp": "330",
"stage": null,
"card_text": "VMAX rule: When your VMAX Pokemon is Knocked Out...",
"attacks": ["Fire Spin - 320 damage"],
"weakness": "Water",
"resistance": null,
"retreat_cost": "3"
},
"tcgplayer": {
"url": "https://tcgplayer.com/product/123456",
"prices": [{
"low_price": 245.99,
"mid_price": 299.99,
"high_price": 450.00,
"market_price": 285.00,
"direct_low_price": 250.00,
"updated_at": "2025-12-16T04:00:00Z"
}]
},
"cardmarket": {
"product_name": "Charizard VMAX (Secret)",
"product_url": "https://cardmarket.com/product/789012",
"prices": [{
"variant_type": "normal",
"avg": 260.50,
"low": 240.00,
"trend": 270.00,
"avg1": 258.30,
"avg7": 255.80,
"avg30": 280.50,
"updated_at": "2025-12-16T04:00:00Z"
}]
}
}/cards/:id/price-historyComing SoonGet CardMarket price history with 1, 7, and 30-day averages and percentage changes for all card variants.
⏳ This endpoint is currently in development and will be available soon after thorough testing.
/cards/:id/price-comparisonComing SoonCompare prices between TCGPlayer and CardMarket with best deal analysis and recommendations.
⏳ This endpoint is currently in development and will be available soon after thorough testing.
/cards/:id/variantsComing SoonGet all available variants of a card (normal, holo, reverse holo, etc.) with prices and availability from both markets.
⏳ This endpoint is currently in development and will be available soon after thorough testing.
Sets Endpoints
/setsGet list of all Pokemon sets with card counts.
Example Request:
curl -H "X-API-Key: pk_live_your_key_here" \
"https://api.pokewallet.io/sets"Response Example:
{
"success": true,
"data": [
{
"name": "Scarlet & Violet",
"set_code": "SV1",
"card_count": 198
},
{
"name": "Silver Tempest",
"set_code": "SWSH12",
"card_count": 245
},
{
"name": "Darkness Ablaze",
"set_code": "SWSH3",
"card_count": 189
}
],
"total": 150
}/sets/:setCodeGet set details with paginated card list.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
setCode | string | Required | Set code (e.g., "SWSH3", "SV1") |
page | number | Optional | Page number (default: 1) |
limit | number | Optional | Results per page (default: 50, max: 200) |
Example Request:
curl -H "X-API-Key: pk_live_your_key_here" \
"https://api.pokewallet.io/sets/SWSH3"Response Example:
{
"success": true,
"set": {
"name": "Darkness Ablaze",
"set_code": "SWSH3",
"total_cards": 189
},
"cards": [
{
"id": "pk_xyz123",
"name": "Charizard VMAX",
"clean_name": "Charizard VMAX",
"card_number": "20/189",
"rarity": "Secret Rare",
"card_type": "Pokemon",
"sub_type_name": "VMAX",
"hp": "330",
"url": "https://tcgplayer.com/product/123456",
"TCG_Prices": [{
"low_price": 245.99,
"market_price": 285.00,
"updated_at": "2025-12-16T04:00:00Z"
}]
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 189,
"total_pages": 4
}
}/sets/:setCode/statisticsComing SoonGet complete set statistics including price analysis, rarity breakdown, and most expensive cards.
⏳ This endpoint is currently in development and will be available soon after thorough testing.
/sets/trendingComing SoonGet sets with highest price changes and trending cards in the last 7 or 30 days.
⏳ This endpoint is currently in development and will be available soon after thorough testing.
/sets/:setCode/completion-valueComing SoonCalculate total cost to complete a set comparing TCGPlayer and CardMarket with rarity breakdown.
⏳ This endpoint is currently in development and will be available soon after thorough testing.
Analytics Endpoints
/analytics/top-cardsComing SoonGet top cards ranked by price or value growth over 7 or 30-day periods.
⏳ This endpoint is currently in development and will be available soon after thorough testing.
Images Endpoint
/images/:idRetrieve card images by card ID with automatic fallback system. Returns binary image data (JPEG/PNG). Supports both TCG card IDs (pk_xxx) and CardMarket-only card IDs (no prefix).
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Required | Card ID - Two formats supported:
/search, /cards/:id, or /sets/:setCode |
size | string | Optional | Image size: low (~500px, ~50KB) or high (~1000px, ~200KB). Default: low |
Response Headers:
Content-Type:image/jpegorimage/png
Example Requests:
TCG Card (with pk_ prefix):
curl -H "X-API-Key: pk_live_your_key_here" \
"https://api.pokewallet.io/images/pk_72046138a4c1908a9f27c93fdd8189ba4ac8e683efaed6b9161efcef129302394a9ec1d20d?size=high" \
--output pikachu_tcg.jpgCardMarket-Only Card (no prefix):
curl -H "X-API-Key: pk_live_your_key_here" \
"https://api.pokewallet.io/images/8eb728bd59d4e1a0d94c354e4cc65a7465b55cfa4261bfa93301faa5ec921f97?size=high" \
--output cubone_v1.jpgset parameter for disambiguation. The ID itself uniquely identifies the exact card variant you want. Example Response (Headers):
HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: 123456
[Binary image data]Code Examples
const API_KEY = process.env.POKEWALLET_API_KEY;
const BASE_URL = 'https://api.pokewallet.io';
async function searchCards(query) {
const response = await fetch(`${BASE_URL}/search?q=${encodeURIComponent(query)}`, {
headers: {
'X-API-Key': API_KEY
}
});
if (!response.ok) {
if (response.status === 429) {
throw new Error('Rate limit exceeded');
}
throw new Error(`API error: ${response.status}`);
}
const data = await response.json();
return data;
}
async function getCardImage(cardId, size = 'high') {
const url = `${BASE_URL}/images/${cardId}?size=${size}`;
const response = await fetch(url, {
headers: {
'X-API-Key': API_KEY
}
});
if (!response.ok) {
throw new Error(`Failed to fetch image: ${response.status}`);
}
// Return blob for display or download
const blob = await response.blob();
return blob;
}
// Usage - Search TCG cards
searchCards('pikachu')
.then(data => {
console.log('TCG card results:', data);
// IDs will have pk_ prefix
})
.catch(error => console.error(error));
// Usage - Search CardMarket-only cards
searchCards('cubone cbb3c')
.then(data => {
console.log('CardMarket-only results:', data);
// IDs will NOT have pk_ prefix
})
.catch(error => console.error(error));
// Usage - Get Image (TCG card with pk_ prefix)
getCardImage('pk_72046138a4c1908a9f27c93fdd8189ba...', 'high')
.then(blob => {
const imageUrl = URL.createObjectURL(blob);
document.querySelector('img').src = imageUrl;
})
.catch(error => console.error(error));
// Usage - Get Image (CardMarket-only, no prefix)
getCardImage('8eb728bd59d4e1a0d94c354e4cc65a74...', 'high')
.then(blob => {
const imageUrl = URL.createObjectURL(blob);
document.querySelector('img').src = imageUrl;
})
.catch(error => console.error(error));Error Handling
The API uses standard HTTP status codes to indicate success or failure:
Request successful
Invalid parameters or malformed request
Missing or invalid API key
Rate limit exceeded
Something went wrong on our side
Error Response Format
{
"error": "Error type",
"message": "Human-readable error description",
"details": {
// Additional error information (optional)
}
}Best Practices
Use Environment Variables
Never hardcode API keys. Always use environment variables or secure secret management.
Handle Rate Limits Gracefully
Implement exponential backoff when you receive a 429 response. Check rate limit headers to avoid hitting limits.
Cache Results
Cache API responses when appropriate to reduce requests and improve performance.
Use Search Endpoint
Always use /search for the most complete and accurate data.
Monitor Your Usage
Check your dashboard regularly to track API usage and avoid unexpected rate limit hits.
Error Handling
Always implement proper error handling for network failures, rate limits, and invalid responses.
Need Help?
If you have questions or run into issues, we're here to help!