CARDSEEKERS
On this page

Cardseekers API

Read-only JSON access to the Cardmarket catalogue behind Cardseekers: every Pokémon single and sealed product with Cardmarket's price guide, the lowest price and the 5 cheapest offers from Dutch sellers of English cards, price history, sets, and the watchlist the monitor tracks.

Base URL https://cardmarket.davey-dd3.workers.dev/api/v1

Quick start

  1. Get a key. Keys are personal and handed out by the Cardseekers team; ask Davey or Hugo. A key looks like cm_live_ followed by 32 letters and digits. Treat it like a password.
  2. Send it with every request as Authorization: Bearer <key> (or X-API-Key: <key>).
  3. Try a search:
    curl -H "Authorization: Bearer $CARDSEEKERS_KEY" \
      "https://cardmarket.davey-dd3.workers.dev/api/v1/cards?q=umbreon&limit=5"
    or use Try it below, right in this page.

What the prices mean

filtered_price
Cardmarket's card page checked with ?sellerCountry=23&language=1: sellers in the Netherlands, English cards, any condition. lowest is the cheapest such offer, offers how many there were, and cheapest_offers the 5 cheapest (price in EUR, condition, quantity, seller), cheapest first. Next to each other they show the real spread: one cheap outlier next to four higher offers is a lucky find, not the price. Every card is re-checked daily; checked_at says when.
price_guide
Cardmarket's own EU-wide daily price guide: all sellers, languages and conditions (low, avg, trend, 1/7/30-day averages, and the same for holo/reverse).
listing
From the expansion's list page on Cardmarket: offers available and the "from" price, all sellers.
cardmarket_url
Always carries the ?sellerCountry=23&language=1 filter, so it opens on the same offers.

These are asking prices. Cardmarket doesn't publish what cards actually sold for.

Keys, limits and expiry

  • Each key can make 120 requests per minute unless it was given another limit. Every response says where you are: X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (Unix time the window resets).
  • Over the limit you get 429 rate_limited with Retry-After (seconds). Wait that long, then retry.
  • Keys can have an expiry date and can be revoked; GET /me shows yours.
  • Everything is GET. Responses are JSON in UTF-8; prices are euros as numbers (3200 = €3,200.00).
  • Browsers may call the API directly (CORS is open), but never put a key in a public web page: anyone can read it there.

Errors

Errors always have the same shape, with a machine-readable code:

{"error": {"code": "invalid_parameter", "message": "'limit' must be between 1 and 100."}}
StatuscodeWhen
400invalid_parameterA parameter is out of range or not allowed.
401unauthorizedNo key was sent.
401invalid_api_keyThe key is wrong or malformed.
401expired_api_keyThe key's expiry date has passed.
401revoked_api_keyThe key was switched off.
403insufficient_scopeThe key may not read this.
404not_foundNo such card, set or watchlist product.
405method_not_allowedAnything other than GET.
409ambiguous_slugA watchlist slug matches more than one product.
429rate_limitedToo many requests; see Retry-After.
500internal_errorSomething broke on our side; try again later.

Pagination

Lists take limit and offset and return data plus:

"pagination": {"limit": 50, "offset": 0, "returned": 50, "has_more": true, "next_offset": 50}

Keep asking with offset=next_offset until has_more is false.

Endpoints

Loading the endpoint list…

Try it

Send a real request from this page. Your key stays in this browser tab only (session storage) and goes nowhere but this API.

Request

OpenAPI

The full machine-readable description (OpenAPI 3.1) is public at /api/v1/openapi.json. Import it into Postman, Insomnia or a code generator to get a typed client.