The archive engine
Live search across four public card databases plus two fact-checked in-house registers, with every result cross-referenced against the live auction. It runs entirely in the browser and calls no Minthouse endpoint.
What it is for#
A bidder looking at a lot wants to know what the card is, which set, which printing, what the artwork looks like, whether the house has one at auction right now. The archive answers that from the games' own public databases rather than from a catalogue Minthouse curated, because a house-curated reference is a house's opinion about what exists.
The sources#
| Game | Source | Coverage |
|---|---|---|
| Pokémon | Pokémon TCG API, with a GraphQL fallback | The complete public database. |
| Magic: The Gathering | Scryfall | Complete, all printings, ordered by release. |
| Yu-Gi-Oh! | YGOPRODeck | Complete. |
| Lorcana | Lorcast | Complete. |
| One Piece | In-house register | Fact-checked against the official Bandai card list. |
| Sports | In-house register | Fact-checked entry by entry: set, number, team, year. |
Why two registers are in-house#
Neither game has a usable public API, so the house maintains its own list and holds it to a stated standard: every entry fact-checked, and every image a verified public-domain scan from Wikimedia Commons. A modern sports card with no public-domain scan says so rather than showing a placeholder that looks like a missing image.
The official card list serves its scans with Cross-Origin-Resource-Policy: same-site. Those URLs return 200 to curl and are refused by every browser, so hotlinking them rendered a broken image in the archive and fired nine dead requests on the auction floor. The register carries no image URLs at all, and cards with no usable public scan say so. The one One Piece card that is also a live lot is drawn as the slab it is, from the house's own photography.
Cross-referencing the live auction#
Every result is checked against the current catalogue. The join is on the card's own image URL, because that URL contains the source database's canonical identifier:
| Source | Key extracted from the lot image |
|---|---|
| Pokémon | ptcg:<set>-<number> |
| Magic | mtg:<scryfall uuid> |
| Yu-Gi-Oh! | ygo:<passcode> |
| Lorcana | lorcana:<card id> |
| One Piece | op:<card code> |
| Sports | An explicit lot cross-reference in the register. |
Where two lots share a key, the index keeps the more interesting one: an open lot beats a closed one, and among open lots the higher current bid wins. A reader who searches a card and sees "At auction" should land on the sale that is actually live.
The status chip#
One short status, plus at most the number that matters. Every state a lot can be in has its own label, so the chip never has to explain itself in a sentence:
| Chip | Means |
|---|---|
| Not at auction | No such lot in the catalogue. |
| At auction | An open auction lot. |
| Closing soon | An open lot inside its last two hours. |
| Closing | Past its close, awaiting the sweeper. |
| Buy Now | A fixed-price listing, available. |
Query handling#
Each source gets a query shaped for its own syntax rather than one string sent to four different APIs and hoped for. On top of that:
- Year expansion. A two-digit year in a search is expanded to the plausible four-digit forms, because collectors write "86 Fleer" and the databases store 1986.
- Token matching for the in-house registers, with a relaxed pass when a strict match returns nothing, and the result is marked as relaxed, so a reader knows they are looking at a near match rather than an exact one.
- Result caps. Sources that can return thousands are capped and sorted before rendering.
Failure behaviour#
Six external services, none of them operated by Minthouse, all of them able to be slow or down. The archive is built on the assumption that at least one of them is having a bad day:
- Every request carries a hard timeout implemented with an abort rather than a promise race, so a server that sends a 200 and then stalls mid-payload is still cut off. A timeout that only rejects the promise leaves the connection open and the tab holding it.
- Best-effort per source. One database being down degrades that game's results; it does not empty the page or throw away the five sources that answered.
- A fallback for Pokémon. If the primary API fails, a GraphQL source answers instead, and results are marked with which database produced them.
- Set release dates are fetched once and reused, rather than per result.
What it does not do#
- It calls no Minthouse endpoint. The archive runs in the browser against public APIs and the catalogue already loaded on the page, so it adds no load to the auction server and cannot affect a live sale.
- It does not price anything. The archive says what a card is rather than what it is worth. Valuation lives in the portfolio engine and is derived from Minthouse's own settled sales.
- It sends nothing about the reader anywhere. No account data leaves the page, and the only requests it makes are the searches themselves.
- It does not claim completeness. Each source's coverage is that source's own, and the two in-house registers are explicitly partial: they cover what has been fact-checked, and say so.
Searching sends the query to the database that owns that game's data, and those services see the reader's IP address under their own terms. Minthouse does not operate them, does not pay them, and cannot guarantee their availability or the accuracy of what they return.