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
Rate Limit: 100 requests per minute per API key. Response headers include 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

StatusMeaning
200Success
401Missing, invalid, or revoked API key
404Resource not found
405Wrong HTTP method
429Rate limit exceeded (100 req/min) — check X-RateLimit-Reset header
500Server error — contact us if persistent

Error bodies always follow: { "error": "message" }

List Products

GET/ge-api/products

Returns a paginated list of inventory items. All filters are optional and combinable.

Query Parameters

ParamTypeDescriptionDefault
qstringCase-insensitive name substring search
gamestringExact game name: Pokémon TCG, Magic: The Gathering, Topps Pokémonall games
setstringExact set name (e.g. Base Set, Scarlet & Violet)
conditionstringOne or comma-separated: Near Mint, Lightly Played, Moderately Played, Heavily Played, Damagedall
in_stockbooleantrue = available only · false = sold out onlyall
foilbooleanFilter by holofoil statusall
reverse_foilbooleanFilter by reverse holo statusall
editionstring1st, unlimited, or shadowlessall
card_numberstringExact card number (e.g. "25/165")
featuredbooleanFilter to featured products onlyall
min_pricenumberMinimum price (USD)
max_pricenumberMaximum price (USD)
sortstringname_asc · name_desc · price_asc · price_desc · updated_desc · created_descname_asc
limitintegerResults per page (max 500)100
offsetintegerPagination offset0
Example request
GET /ge-api/products?game=Pok%C3%A9mon%20TCG&in_stock=true&sort=price_asc&limit=20&key=ge_...
Response
{
  "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

GET/ge-api/products/:id

Returns a single product by its Firestore document ID.

Example request
GET /ge-api/products/abc123?key=ge_...
Response
{
  "product": { ...same shape as above... }
}

Returns 404 if the ID does not exist.

Inventory Summary

GET/ge-api/summary

Aggregate stats across the full inventory — useful for dashboards.

Response
{
  "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

GET/ge-api/games

Returns the distinct game names present in the inventory.

Response
{
  "games": ["Magic: The Gathering", "Pokémon TCG", "Topps Pokémon"]
}

List Sets

GET/ge-api/sets

Returns distinct set names. Optionally filter by game.

ParamTypeDescriptionDefault
gamestringFilter sets to a specific gameall games
Response
{
  "sets": ["Base Set", "Jungle", "Fossil", "Scarlet & Violet", ...],
  "game": "Pokémon TCG"
}

Bulk Product Lookup

POST/ge-api/products/bulk

Look up multiple products by ID in a single request. Maximum 100 IDs.

Request Body
{
  "ids": ["abc123", "def456", "ghi789"]
}
Response
{
  "products": [ ... ],
  "missing": ["def456"]
}

Recent Sales

GET/ge-api/recent-sales

Returns recently sold items with optional buyer reviews.

ParamTypeDescriptionDefault
limitintegerNumber of sales to return (1–100)20
Response
{
  "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

GET/ge-api/webhooks

Register Webhook

POST/ge-api/webhooks
Request Body
{
  "url": "https://your-server.com/ge-webhook",
  "events": ["product.created", "product.updated", "product.deleted", "product.sold", "sale.started", "sale.ended"]
}
Webhook Payload (POST to your URL)
{
  "event": "product.created",
  "timestamp": "2026-03-30T12:00:00.000Z",
  "data": { "id": "abc123", "name": "Charizard ex", "game": "Pokémon TCG", ... }
}

Delete Webhook

DELETE/ge-api/webhooks/:id

Rate Limiting

All authenticated endpoints are rate-limited to 100 requests per minute per API key. Rate limit info is included in response headers:

HeaderDescription
X-RateLimit-LimitMaximum requests per window (100)
X-RateLimit-RemainingRequests remaining in current window
X-RateLimit-ResetSeconds 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.