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.
https://cardmarket.davey-dd3.workers.dev/api/v1
Quick start
- 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. - Send it with every request as
Authorization: Bearer <key>(orX-API-Key: <key>). - Try a search:
or use Try it below, right in this page.curl -H "Authorization: Bearer $CARDSEEKERS_KEY" \ "https://cardmarket.davey-dd3.workers.dev/api/v1/cards?q=umbreon&limit=5"
What the prices mean
filtered_price- Cardmarket's card page checked with
?sellerCountry=23&language=1: sellers in the Netherlands, English cards, any condition.lowestis the cheapest such offer,offershow many there were, andcheapest_offersthe 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_atsays 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=1filter, 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-RemainingandX-RateLimit-Reset(Unix time the window resets). - Over the limit you get
429 rate_limitedwithRetry-After(seconds). Wait that long, then retry. - Keys can have an expiry date and can be revoked;
GET /meshows 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."}}
| Status | code | When |
|---|---|---|
| 400 | invalid_parameter | A parameter is out of range or not allowed. |
| 401 | unauthorized | No key was sent. |
| 401 | invalid_api_key | The key is wrong or malformed. |
| 401 | expired_api_key | The key's expiry date has passed. |
| 401 | revoked_api_key | The key was switched off. |
| 403 | insufficient_scope | The key may not read this. |
| 404 | not_found | No such card, set or watchlist product. |
| 405 | method_not_allowed | Anything other than GET. |
| 409 | ambiguous_slug | A watchlist slug matches more than one product. |
| 429 | rate_limited | Too many requests; see Retry-After. |
| 500 | internal_error | Something 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.
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.