📚 Documentation

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.

👨‍🍳Still cooking – Taste it while it's hot!
50,000+ CardsComplete TCG Database
Real-Time PricingTCGPlayer & CardMarket
Fast & ReliableGlobal CDN, <100ms latency
Base URL:https://api.pokewallet.io

Quick Start

Get started with PokéWallet API in 3 simple steps:

1

Create an Account

Sign up for free to get Early Access with generous rate limits.

Sign Up Now
2

Generate an API Key

Create your first API key from the dashboard.

3

Make Your First Request

Start querying the API with your key.

cURL
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
Security Warning: Never expose your API keys in client-side code, public repositories, or logs. Always use environment variables.

Authentication Methods

You can authenticate using either the X-API-Key header or Authorization header:

X-API-Key Header (Recommended)
curl -H "X-API-Key: pk_live_your_key_here" \
     "https://api.pokewallet.io/search?q=pikachu"
Authorization Header
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:

PlanHourly LimitDaily LimitPrice
Free50 requests100 requests$0/month
Early Access ⭐1,000 requests10,000 requests$0/month
Pro10,000 requests100,000 requestsContact us
Early Access: All new users get the Early Access plan with 20x more requests than the Free plan!

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: 8234

Rate 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)

pk_ + hash

Format: pk_ + hexadecimal hash

Example:

pk_72046138a4c1908a9f27c93fdd8189ba...

Usage: All cards with TCGPlayer data (even if they also have CardMarket data)

CardMarket-Only Cards

No prefix

Format: Direct hexadecimal hash (no pk_ prefix)

Example:

2208e8a2750c07d89e54870ffcef80d1...

Usage: Only cards exclusively from CardMarket (e.g., Japanese sets, European promos)

Unique Variants: Cards with the same card_number but different variants (V1, V2, etc.) have unique IDs.

Public Endpoints

No Authentication Required: These endpoints are publicly accessible.
GET/healthNo Auth Required

Check API status, database, cache, and storage health with response times.

Example Request:

cURL
curl "https://api.pokewallet.io/health"

Response Example (Healthy):

200 OK
{
  "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):

503 Service Unavailable
{
  "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"
}
GET/No Auth Required

Get API information, version, and available endpoints.

Example Request:

cURL
curl "https://api.pokewallet.io/"

Response Example:

200 OK
{
  "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

Authentication Required: All Search endpoints require an API key.
GET/search/by-price-rangeComing Soon

Search 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.

GET/search/by-typeComing Soon

Search 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

Authentication Required: All Cards endpoints require an API key in the X-API-Key header.
GET/cards/:id

Get complete card details with unified pricing from TCGPlayer and CardMarket.

Parameters:

ParameterTypeRequiredDescription
idstringRequiredCard ID - Two formats supported:
  • TCG cards: pk_xxx (with prefix)
  • CardMarket-only: hexadecimal hash (no prefix)
set_codestringOptionalSet code for disambiguation (e.g., "SWSH3", "SV1", "CBB3C"). Supports both alphanumeric codes and numeric group IDs.

Example Request:

cURL
curl -H "X-API-Key: pk_live_your_key_here" \
     "https://api.pokewallet.io/cards/pk_xxx"

Response Example:

200 OK
{
  "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"
    }]
  }
}
GET/cards/:id/price-historyComing Soon

Get 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.

GET/cards/:id/price-comparisonComing Soon

Compare 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.

GET/cards/:id/variantsComing Soon

Get 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

Authentication Required: All Sets endpoints require an API key.
GET/sets

Get 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:

200 OK
{
  "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
}
GET/sets/:setCode

Get set details with paginated card list.

Parameters:

ParameterTypeRequiredDescription
setCodestringRequiredSet code (e.g., "SWSH3", "SV1")
pagenumberOptionalPage number (default: 1)
limitnumberOptionalResults 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:

200 OK
{
  "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
  }
}
GET/sets/:setCode/statisticsComing Soon

Get 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.

GET/sets/:setCode/completion-valueComing Soon

Calculate 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

Authentication Required: All Analytics endpoints require an API key.
GET/analytics/top-cardsComing Soon

Get 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

Authentication Required: The Images endpoint requires an API key.
GET/images/:id

Retrieve 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).

nella

Parameters:

ParameterTypeRequiredDescription
idstringRequiredCard ID - Two formats supported:
  • TCG cards: pk_xxx (with prefix)
  • CardMarket-only: hexadecimal hash (no prefix)
Obtained from /search, /cards/:id, or /sets/:setCode
sizestringOptionalImage size: low (~500px, ~50KB) or high (~1000px, ~200KB). Default: low

Response Headers:

  • Content-Type: image/jpeg or image/png

Example Requests:

TCG Card (with pk_ prefix):
High Resolution TCG Card
curl -H "X-API-Key: pk_live_your_key_here" \
     "https://api.pokewallet.io/images/pk_72046138a4c1908a9f27c93fdd8189ba4ac8e683efaed6b9161efcef129302394a9ec1d20d?size=high" \
     --output pikachu_tcg.jpg
CardMarket-Only Card (no prefix):
CardMarket-Only Card Image
curl -H "X-API-Key: pk_live_your_key_here" \
     "https://api.pokewallet.io/images/8eb728bd59d4e1a0d94c354e4cc65a7465b55cfa4261bfa93301faa5ec921f97?size=high" \
     --output cubone_v1.jpg
Unique IDs for Variants: Each CardMarket variant (V1, V2, etc.) has its own unique ID, so you don't need to use a set 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

JavaScript (Fetch)
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:

200
OK

Request successful

400
Bad Request

Invalid parameters or malformed request

401
Unauthorized

Missing or invalid API key

429
Too Many Requests

Rate limit exceeded

500
Internal Server Error

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.

Security Reminder: Keep your API keys secure. If you suspect a key has been compromised, revoke it immediately from your dashboard and generate a new one.

Need Help?

If you have questions or run into issues, we're here to help!