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.
https://api.pokewallet.ioQuick Start
Start fetching One Piece card data in seconds:
Make Your First Request
Fetch all One Piece sets with a single call:
curl https://api.pokewallet.io/op/sets \
-H "X-API-Key: YOUR_API_KEY"Fetch a Specific Set
Get all cards in OP01 — Romance Dawn:
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:
curl -H "X-API-Key: YOUR_API_KEY" \
"https://api.pokewallet.io/op/sets"curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.pokewallet.io/op/sets"Rate Limits
Rate limits are shared across Pokémon and One Piece endpoints. They vary by subscription plan:
| Plan | Hourly Limit | Daily Limit | Price |
|---|---|---|---|
| Free | 100 requests | 1,000 requests | $0/month |
| Early Access ⭐ | 1,000 requests | 10,000 requests | No longer available |
| Coffee ☕ | 1,000+ requests | 10,000+ requests | Buy a coffee on Ko-fi |
| Pro | 5,000 requests | 50,000 requests | €20/month |
| Business | Custom | Custom | Contact us |
Early Access was our initial launch tier and is no longer available for new users.
Rate Limit Headers
Every API response includes rate limit information:
X-RateLimit-Limit-Hour: 100
X-RateLimit-Remaining-Hour: 95
X-RateLimit-Limit-Day: 1000
X-RateLimit-Remaining-Day: 823Sets Endpoints
/op/setsReturns all One Piece sets ordered by release date.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
language | string | Optional | Filter by language: en or jp |
Example Request:
curl -H "X-API-Key: pk_live_your_key_here" \
"https://api.pokewallet.io/op/sets?language=en"Response Example:
{
"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. /op/sets/:setCodeReturns a paginated card list for a specific One Piece set.
Path Parameter:
| Value | Behavior |
|---|---|
OP01 | Lookup by set_code (case-insensitive) |
3188 | Lookup by numeric group_id |
-8 | CM-only set (negative group_id) |
EB01 | Fuzzy fallback: automatically tries EB-01 |
Query Parameters:
| Parameter | Default | Max |
|---|---|---|
page | 1 | — |
limit | 50 | 200 |
Example Request:
curl -H "X-API-Key: pk_live_your_key_here" \
"https://api.pokewallet.io/op/sets/OP01?page=1&limit=50"Response Example:
{
"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 }
}
}
]
}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
/op/cards/:idReturns details for a single One Piece card. The id must use the op_ prefix.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | Required | Card ID with op_ prefix. Obtained from /op/search, /op/sets/:setCode, or /op/prices. |
Example Request:
curl -H "X-API-Key: pk_live_your_key_here" \
"https://api.pokewallet.io/op/cards/op_3f8a12c4e9b7d02f..."Response Example:
{
"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:
| HTTP | Condition |
|---|---|
400 | ID missing op_ prefix |
400 | Corrupted or undecryptable payload |
404 | Card not found in DB |
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
/op/searchFull-text search on One Piece card name and card_number.
Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
q | string | Required | ILIKE %q% on card name and card_number (e.g. zoro, OP01-001) |
page | number | Optional | Page number (default: 1, min: 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/op/search?q=zoro&page=1&limit=20"Response Example:
{
"success": true,
"data": [
{
"id": "op_3f8a12c4e9b7d02f...",
"card_number": "OP01-001",
"name": "Roronoa Zoro",
"sub_type_name": "Normal",
"rarity": "L",
"card_type": "Leader",
"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 }
}
}
],
"total": 12,
"page": 1,
"limit": 20
}d'artagnan) return 0 results due to ILIKE handling of special characters. CM-only cards are not indexed for name search — only TCG cards appear in results. Prices Endpoints
/op/prices?set_code={set_code}PRORaw prices for an entire One Piece set, all variants, no filtering. The set is identified via query parameters — set_code or group_id — not as a path segment. At least one is required.
/op/prices?set_code=OP01 ✓ /op/prices/OP01 ✗ Parameters:
| Parameter | Type | Required | Examples |
|---|---|---|---|
set_code | string | One of these | OP01, EB-01, EB01 (fuzzy → EB-01) |
group_id | number | One of these | 3188, -8 (CM-only set) |
Example Request:
# 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:
{
"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:
| HTTP | Condition |
|---|---|
400 | Neither set_code nor group_id provided |
404 | Set not found |
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
/images/:idReturns card images served via CDN. Use the card's id as the path parameter.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
id | string | Card identifier (e.g. OP01-001) |
Example Request:
curl https://api.pokewallet.io/images/OP01-001 \
-H "X-API-Key: YOUR_API_KEY"image_url field returned by card endpoints to construct the URL directly.Code Examples
JavaScript / Node.js
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
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:
Request successful
Invalid parameters or malformed request
Missing or invalid API key
Set or card does not exist
Rate limit exceeded
Something went wrong on our side
Error Response Format
{
"error": "Not Found",
"message": "Set 'OP99' does not exist.",
"status": 404
}