MTG Copilot Docs
Your data

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

FieldHeader names accepted
QuantityQuantity, Count
Card nameName
Set codeSet Code, Edition Code
Set nameSet Name, Edition Name, Set
Collector numberCollector Number, Card Number
Scryfall IDScryfall ID
FoilFoil, Finish, Printing
ConditionCondition
Purchase pricePurchase Price, My Price, Price
LanguageLanguage

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:

  1. Scryfall ID → an exact printing.
  2. Set code + collector number → an exact printing.
  3. Name + set code → that card in that set.
  4. 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:

GradeAccepts
NMNear Mint, Mint, nm, m
LPLightly Played, Excellent, Good, lp
MPModerately Played, Played, mp
HPHeavily Played, Poor, hp
DMGDamaged, 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/.

On this page