GE Partner API
Live inventory access for Game Enthusiasts LLC
The GE API provides read access to our live card inventory — Pokémon TCG, Magic: The Gathering, and Topps. All responses are JSON. The base URL for every endpoint is:
https://ge-functions-531174047904.us-central1.run.app/ge-api
X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset.Authentication
Every request requires an API key. Pass it one of two ways:
Query parameter
GET /ge-api/products?key=ge_a3f9c2...
Authorization header
GET /ge-api/products
Authorization: Bearer ge_a3f9c2...
Keys are issued after review. Request one below. You can revoke or rotate a key at any time by contacting us.
Errors
| Status | Meaning |
|---|---|
200 | Success |
401 | Missing, invalid, or revoked API key |
404 | Resource not found |
405 | Wrong HTTP method |
429 | Rate limit exceeded (100 req/min) — check X-RateLimit-Reset header |
500 | Server error — contact us if persistent |
Error bodies always follow: { "error": "message" }
List Products
Returns a paginated list of inventory items. All filters are optional and combinable.
Query Parameters
| Param | Type | Description | Default |
|---|---|---|---|
q | string | Case-insensitive name substring search | — |
game | string | Exact game name: Pokémon TCG, Magic: The Gathering, Topps Pokémon | all games |
set | string | Exact set name (e.g. Base Set, Scarlet & Violet) | — |
condition | string | One or comma-separated: Near Mint, Lightly Played, Moderately Played, Heavily Played, Damaged | all |
in_stock | boolean | true = available only · false = sold out only | all |
foil | boolean | Filter by holofoil status | all |
reverse_foil | boolean | Filter by reverse holo status | all |
edition | string | 1st, unlimited, or shadowless | all |
card_number | string | Exact card number (e.g. "25/165") | — |
featured | boolean | Filter to featured products only | all |
min_price | number | Minimum price (USD) | — |
max_price | number | Maximum price (USD) | — |
sort | string | name_asc · name_desc · price_asc · price_desc · updated_desc · created_desc | name_asc |
limit | integer | Results per page (max 500) | 100 |
offset | integer | Pagination offset | 0 |
GET /ge-api/products?game=Pok%C3%A9mon%20TCG&in_stock=true&sort=price_asc&limit=20&key=ge_...
{
"products": [
{
"id": "abc123",
"name": "Charizard",
"game": "Pokémon TCG",
"set": "Base Set",
"cardNumber": "4/102",
"condition": "Lightly Played",
"price": 249.99,
"stock": 1,
"inStock": true,
"isFoil": true,
"isReverseFoil": false,
"edition": "unlimited",
"language": "English",
"rarity": "Rare Holo",
"images": ["https://..."],
"inquireOnly": false,
"updatedAt": 1711234567890
}
],
"total": 142,
"limit": 20,
"offset": 0,
"hasMore": true
}
Get Product
Returns a single product by its Firestore document ID.
GET /ge-api/products/abc123?key=ge_...
{
"product": { ...same shape as above... }
}
Returns 404 if the ID does not exist.
Inventory Summary
Aggregate stats across the full inventory — useful for dashboards.
{
"totalListings": 312,
"inStock": 189,
"soldOut": 123,
"byGame": {
"Pokémon TCG": { "total": 280, "inStock": 165, "soldOut": 115 },
"Magic: The Gathering": { "total": 28, "inStock": 21, "soldOut": 7 },
"Topps Pokémon": { "total": 4, "inStock": 3, "soldOut": 1 }
},
"pricing": {
"averagePrice": 34.50,
"minPrice": 0.50,
"maxPrice": 1200.00,
"totalInventoryValue": 10764.00
}
}
List Games
Returns the distinct game names present in the inventory.
{
"games": ["Magic: The Gathering", "Pokémon TCG", "Topps Pokémon"]
}
List Sets
Returns distinct set names. Optionally filter by game.
| Param | Type | Description | Default |
|---|---|---|---|
game | string | Filter sets to a specific game | all games |
{
"sets": ["Base Set", "Jungle", "Fossil", "Scarlet & Violet", ...],
"game": "Pokémon TCG"
}
Bulk Product Lookup
Look up multiple products by ID in a single request. Maximum 100 IDs.
{
"ids": ["abc123", "def456", "ghi789"]
}
{
"products": [ ... ],
"missing": ["def456"]
}
Recent Sales
Returns recently sold items with optional buyer reviews.
| Param | Type | Description | Default |
|---|---|---|---|
limit | integer | Number of sales to return (1–100) | 20 |
{
"sales": [
{ "id": "...", "name": "Charizard ex", "game": "Pokémon TCG", "set": "Obsidian Flames",
"price": 42.99, "condition": "Near Mint", "soldAt": 1711756800000,
"buyerReview": { "stars": 5, "text": "Perfect card, fast shipping!" } }
],
"total": 1
}
Webhooks
Register webhook URLs to receive real-time notifications when inventory changes. Webhooks are automatically disabled after 10 consecutive delivery failures.
List Webhooks
Register Webhook
{
"url": "https://your-server.com/ge-webhook",
"events": ["product.created", "product.updated", "product.deleted", "product.sold", "sale.started", "sale.ended"]
}
{
"event": "product.created",
"timestamp": "2026-03-30T12:00:00.000Z",
"data": { "id": "abc123", "name": "Charizard ex", "game": "Pokémon TCG", ... }
}
Delete Webhook
Rate Limiting
All authenticated endpoints are rate-limited to 100 requests per minute per API key. Rate limit info is included in response headers:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per window (100) |
X-RateLimit-Remaining | Requests remaining in current window |
X-RateLimit-Reset | Seconds until the window resets |
When rate limited, the API returns 429 Too Many Requests with a retryAfterMs field.
Request API Key
Submit your details below. Requests are reviewed manually — you'll be contacted at your email once approved.