Importing a collection
Supported CSV exports from Moxfield, Archidekt, Deckbox, ManaBox and TCGplayer, and what to do when a row does not match.
Export a CSV from whichever tool you keep your collection in and upload it at
/collection. Five tools are recognized by name, and an
unrecognized CSV still imports as long as its columns are named sensibly.
The one rule that makes this work
Columns are matched by header name, never by position.
That is why an export from an old version of an app still imports after the app adds a column, and why Archidekt works at all: its export columns are chosen by you, so there is no fixed order to rely on. Reorder the columns in your CSV, add your own, delete ones you do not want. As long as the headers you keep are named the same, it imports.
Columns we do not recognize are ignored, so an export with extra fields still works.
What gets read
| Field | Header names accepted |
|---|---|
| Quantity | Quantity, Count |
| Card name | Name |
| Set code | Set Code, Edition Code |
| Set name | Set Name, Edition Name, Set |
| Collector number | Collector Number, Card Number |
| Scryfall ID | Scryfall ID |
| Foil | Foil, Finish, Printing |
| Condition | Condition |
| Purchase price | Purchase Price, My Price, Price |
| Language | Language |
Header matching is case-insensitive and the names above are matched exactly.
Four of them also accept an underscored spelling: set_code,
collector_number, scryfall_id and purchase_price.
Everything else is read past: tags, dates added, tradelist counts, artist proof and altered flags, TCGplayer product IDs. If you need those, they stay in your original export.
Per tool
ManaBox
The best-supported export, because it includes a native Scryfall ID: every row resolves to an exact printing with no guessing.
Find it under collection export in the app. The foil column is Foil, with
values normal, foil or etched. Conditions come through lowercase
(near_mint, light_played, and so on) and are translated.
Archidekt
Also carries a native Scryfall ID, and gives both set name and set code.
Archidekt lets you choose which columns to export. Include Scryfall ID if it
is offered, and every row matches exactly. The foil column is
Finish, with values Normal, Foil or Etched.
Moxfield
No Scryfall ID, so rows resolve by set code plus collector number, which is still exact.
Moxfield's Edition column holds the set code (bro), not the set name.
The foil column is blank, foil or etched. Older exports omit the Tags and
Last Modified columns, which is harmless, since nothing is read by
position.
Deckbox
Deckbox's Edition column holds the set name ("The Brothers' War"), where
Moxfield's column of the same name holds the code. Both work, because set name
and set code are separate fields on our side. It is the one place two tools use
the same header for different things.
Collector number is Card Number, and purchase price is My Price. Deckbox can
optionally include a Scryfall ID column; turn it on if you can.
TCGplayer
The app export identifies cards by TCGplayer's own Product ID and SKU, so
rows resolve by set code plus card number instead. The foil column is
Printing, with values Normal or Foil.
The seller / BinderPOS export is a different file with different headers
(TCGplayer Id, Product Name, Total Quantity). It is a sixth shape that
none of the five signatures match, so it falls through to name matching. Expect
lower accuracy.
Something else
An unrecognized CSV is parsed with the same header-name rules. If your file has
a Name column and a Quantity or Count column, it will very likely work.
How a row is matched to a card
In order, stopping at the first that succeeds:
- Scryfall ID → an exact printing.
- Set code + collector number → an exact printing.
- Name + set code → that card in that set.
- Name alone → the newest printing of the card.
The fourth is a guess and is labelled as one. The import preview marks these as matched by name, so you can see which rows are uncertain before committing. It picks the newest printing deterministically, so the same file imported twice gives the same result. If you care which printing you own, export with set codes.
Foil and condition
A row is either normal or foil, decided by the foil column. Values foil and
etched count as foil, and everything else counts as normal. Etched cards are
recorded as foil, so there is no third category.
Conditions are translated into five grades, since every tool words them differently:
| Grade | Accepts |
|---|---|
| NM | Near Mint, Mint, nm, m |
| LP | Lightly Played, Excellent, Good, lp |
| MP | Moderately Played, Played, mp |
| HP | Heavily Played, Poor, hp |
| DMG | Damaged, dmg, d |
Deckbox and ManaBox use "Excellent" and "Good" to mean slightly different things. Both map to Lightly Played, which is the closest honest grade rather than a precise conversion. An unrecognized condition is left empty.
When something does not match
A row did not match any card. Usually a set code we do not have, or a collector number with a suffix the export wrote differently. Check the card in search and compare the set code.
A row matched the wrong printing. Almost always a name-only match. Add a
Set Code column to your export and re-import.
Foil copies came in as normal, or the other way round. One row carries one quantity, and the foil column decides which bucket it lands in. A hand-made CSV with separate "normal count" and "foil count" columns imports only one of them. Split those into two rows, each with its own foil value. All five supported exports use one row per finish, so this only bites custom files.
Nothing imported at all. The file probably has no recognizable header row. The first line must be headers, not a title or an export timestamp.
The header names and per-tool quirks above were verified against real exports
from each tool. Exports do change, so if a tool has renamed a column since, that
is worth reporting. The parser itself lives in packages/core/src/collection/.