One Piece Card Game API

One Piece
API Documentation

Complete REST reference for the One Piece Card Game API. Real-time prices from TCGPlayer and CardMarket, full card and set database for all OPCG sets.

All OPCG SetsOP01 → latest releases
Dual MarketTCGPlayer (USD) + CardMarket (EUR)
Real-Time PricesUpdated daily
Base URL:https://api.pokewallet.io
Same API key works for both Pokémon TCG and One Piece Card Game endpoints. Get your key →

Quick Start

Start fetching One Piece card data in seconds:

1

Get an API Key

Sign up for free to get your API key. No credit card required.

Sign Up Free
2

Make Your First Request

Fetch all One Piece sets with a single call:

cURL
curl https://api.pokewallet.io/op/sets \
  -H "X-API-Key: YOUR_API_KEY"
3

Fetch a Specific Set

Get all cards in OP01 — Romance Dawn:

cURL
curl https://api.pokewallet.io/op/sets/OP01 \
  -H "X-API-Key: YOUR_API_KEY"

Authentication

All API requests require authentication using an API key. Pass it in the request header:

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: YOUR_API_KEY" \
     "https://api.pokewallet.io/op/sets"
Authorization Header
curl -H "Authorization: Bearer YOUR_API_KEY" \
     "https://api.pokewallet.io/op/sets"
Get your API key from the Dashboard. The same key works for all endpoints — Pokémon and One Piece.
Security Warning: Never expose your API keys in client-side code, public repositories, or logs. Always use environment variables.

Rate Limits

Rate limits are shared across Pokémon and One Piece endpoints. They vary by subscription plan:

PlanHourly LimitDaily LimitPrice
Free100 requests1,000 requests$0/month
Early Access ⭐1,000 requests10,000 requestsNo longer available
Coffee ☕1,000+ requests10,000+ requestsBuy a coffee on Ko-fi
Pro5,000 requests50,000 requests€20/month
BusinessCustomCustomContact us
All new users start on the Free plan. Upgrade from your dashboard.
Early Access was our initial launch tier and is no longer available for new users.
Please note: After upgrading your plan, activation may require a couple of hours.

Rate Limit Headers

Every API response includes rate limit information:

http
X-RateLimit-Limit-Hour: 100
X-RateLimit-Remaining-Hour: 95
X-RateLimit-Limit-Day: 1000
X-RateLimit-Remaining-Day: 823

Sets Endpoints

GET/op/sets

Returns all One Piece sets ordered by release date.

Parameters:

ParameterTypeRequiredDescription
languagestringOptionalFilter by language: en or jp

Example Request:

cURL
curl -H "X-API-Key: pk_live_your_key_here" \
     "https://api.pokewallet.io/op/sets?language=en"

Response Example:

200 OK
{
  "success": true,
  "data": [
    {
      "name": "Romance Dawn",
      "set_code": "OP01",
      "group_id": "3188",
      "language": "en",
      "release_date": "2022-12-02"
    },
    {
      "name": "Paramount War",
      "set_code": "OP02",
      "group_id": "3189",
      "language": "en",
      "release_date": "2023-03-10"
    }
  ],
  "total": 100
}
group_id is the numeric identifier for the set in the DB. Positive = TCG set, negative = CM-only set (no TCGPlayer data). Set images are not available for One Piece sets.
GET/op/sets/:setCode

Returns a paginated card list for a specific One Piece set.

Path Parameter:

ValueBehavior
OP01Lookup by set_code (case-insensitive)
3188Lookup by numeric group_id
-8CM-only set (negative group_id)
EB01Fuzzy fallback: automatically tries EB-01

Query Parameters:

ParameterDefaultMax
page1
limit50200

Example Request:

cURL
curl -H "X-API-Key: pk_live_your_key_here" \
     "https://api.pokewallet.io/op/sets/OP01?page=1&limit=50"

Response Example:

200 OK
{
  "success": true,
  "set": {
    "set_code": "OP01",
    "group_id": "3188",
    "name": "Romance Dawn",
    "language": "en",
    "release_date": "2022-12-02"
  },
  "total": 50,
  "page": 1,
  "limit": 50,
  "data": [
    {
      "id": "op_3f8a12c4e9b7d02f...",
      "card_number": "OP01-001",
      "name": "Roronoa Zoro",
      "clean_name": "Roronoa Zoro",
      "sub_type_name": "Normal",
      "rarity": "L",
      "card_type": "Leader",
      "ext_color": "Red",
      "ext_cost": null,
      "ext_power": "5000",
      "ext_life": "5",
      "ext_subtypes": "Straw Hat Crew;Supernovas",
      "ext_attribute": "Slash",
      "ext_counterplus": null,
      "ext_description": "[DON!! x1] ...",
      "tcgplayer": {
        "url": "https://www.tcgplayer.com/product/...",
        "prices": {
          "low_price": 1.20,
          "market_price": 1.76,
          "high_price": 3.50
        }
      },
      "cardmarket": {
        "product_name": "Roronoa Zoro (OP01-001)",
        "product_url": "https://www.cardmarket.com/...",
        "prices": { "avg": 1.64, "low": 0.50, "trend": 1.70 }
      }
    }
  ]
}
CM-only sets (negative group_id): cards have tcgplayer: null and no ext_* fields. total is the full card count for the set (not just the current page). Each card also includes a clean_name field (normalized name without special characters).

Cards Endpoints

GET/op/cards/:id

Returns details for a single One Piece card. The id must use the op_ prefix.

Parameters:

ParameterTypeRequiredDescription
idstringRequiredCard ID with op_ prefix. Obtained from /op/search, /op/sets/:setCode, or /op/prices.

Example Request:

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

Response Example:

200 OK
{
  "id": "op_3f8a12c4e9b7d02f...",
  "card_number": "OP01-001",
  "name": "Roronoa Zoro",
  "clean_name": "Roronoa Zoro",
  "sub_type_name": "Normal",
  "rarity": "L",
  "card_type": "Leader",
  "ext_color": "Red",
  "ext_cost": null,
  "ext_power": "5000",
  "ext_life": "5",
  "ext_subtypes": "Straw Hat Crew;Supernovas",
  "ext_attribute": "Slash",
  "ext_counterplus": null,
  "ext_description": "[DON!! x1] [Activate: Main] ...",
  "tcgplayer": {
    "url": "https://www.tcgplayer.com/product/...",
    "prices": {
      "low_price": 1.20,
      "market_price": 1.76,
      "high_price": 3.50
    }
  },
  "cardmarket": {
    "product_name": "Roronoa Zoro (OP01-001)",
    "product_url": "https://www.cardmarket.com/...",
    "prices": { "avg": 1.64, "low": 0.50, "trend": 1.70 }
  }
}

Error Codes:

HTTPCondition
400ID missing op_ prefix
400Corrupted or undecryptable payload
404Card not found in DB
CM-only cards (group_id < 0): tcgplayer: null, all ext_* fields are null. SP reprints: cards whose card_number belongs to a different set return cardmarket: null to avoid cross-set price collisions.

Search Endpoints

Prices Endpoints

GET/op/prices?set_code={set_code}PRO

Raw prices for an entire One Piece set, all variants, no filtering. The set is identified via query parametersset_code or group_id — not as a path segment. At least one is required.

Query parameters only. /op/prices?set_code=OP01 ✓    /op/prices/OP01
Pro feature — 7-day free trial available. Activate your free trial from the dashboard to access this endpoint at no cost.

Parameters:

ParameterTypeRequiredExamples
set_codestringOne of theseOP01, EB-01, EB01 (fuzzy → EB-01)
group_idnumberOne of these3188, -8 (CM-only set)

Example Request:

cURL
# by set_code (case-insensitive)
curl -H "X-API-Key: pk_live_your_key_here" \
     "https://api.pokewallet.io/op/prices?set_code=OP01"

# by group_id (numeric)
curl -H "X-API-Key: pk_live_your_key_here" \
     "https://api.pokewallet.io/op/prices?group_id=3188"

Response Example:

200 OK
{
  "success": true,
  "group_id": "3188",
  "total": 159,
  "data": [
    {
      "card_number": "OP01-001",
      "name": "Roronoa Zoro (001)",
      "variant": "Normal",
      "tcgplayer": {
        "low_price": 1.20,
        "market_price": 1.76,
        "high_price": 3.50,
        "mid_price": 2.10,
        "direct_low_price": 1.50,
        "updated_at": "2026-05-14T00:00:00Z"
      },
      "cardmarket": {
        "avg": 1.64,
        "low": 0.50,
        "trend": 1.70,
        "avg1": 1.60,
        "avg7": 1.65,
        "avg30": 1.70,
        "updated_at": "2026-05-14T00:00:00Z"
      }
    },
    {
      "card_number": "OP01-001",
      "name": "Roronoa Zoro (001) (Foil)",
      "variant": "Foil",
      "tcgplayer": { "low_price": 3.50, "market_price": 4.20, "high_price": 6.00, "...": "..." },
      "cardmarket": { "avg": 3.80, "low": 2.50, "trend": 3.90, "...": "..." }
    }
  ]
}

Error Codes:

HTTPCondition
400Neither set_code nor group_id provided
404Set not found
For CM-only sets (group_id < 0): tcgplayer: null on all cards and variant: null (CM does not expose sub_type_name). The cardmarket object is always present with real prices.

Images Endpoint

GET/images/:id

Returns card images served via CDN. Use the card's id as the path parameter.

Path Parameters

ParameterTypeDescription
idstringCard identifier (e.g. OP01-001)

Example Request:

cURL
curl https://api.pokewallet.io/images/OP01-001 \
  -H "X-API-Key: YOUR_API_KEY"
Images are served as binary content. Use the image_url field returned by card endpoints to construct the URL directly.

Code Examples

JavaScript / Node.js

javascript
const API_KEY = 'YOUR_API_KEY';
const BASE_URL = 'https://api.pokewallet.io';

// Fetch all OP sets
const res = await fetch(`${BASE_URL}/op/sets`, {
  headers: { 'X-API-Key': API_KEY }
});
const { sets } = await res.json();

// Get a specific set
const setRes = await fetch(`${BASE_URL}/op/sets/OP01`, {
  headers: { 'X-API-Key': API_KEY }
});
const setData = await setRes.json();

// Search for a card
const searchRes = await fetch(
  `${BASE_URL}/op/search?q=Luffy`,
  { headers: { 'X-API-Key': API_KEY } }
);
const { results } = await searchRes.json();

Python

python
import requests

API_KEY = 'YOUR_API_KEY'
BASE_URL = 'https://api.pokewallet.io'
HEADERS = {'X-API-Key': API_KEY}

# Fetch all OP sets
sets = requests.get(f'{BASE_URL}/op/sets', headers=HEADERS).json()

# Get bulk prices for OP07
prices = requests.get(
    f'{BASE_URL}/op/prices',
    params={'set_code': 'OP07'},
    headers=HEADERS
).json()

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

404
Not Found

Set or card does not exist

429
Too Many Requests

Rate limit exceeded

500
Internal Server Error

Something went wrong on our side

Error Response Format

json
{
  "error": "Not Found",
  "message": "Set 'OP99' does not exist.",
  "status": 404
}