Create your account and confirm your email
Use the registration flow, then open the confirmation link from the email before you try to log in.
This page explains the full flow from account setup to imports, dashboard filters, matches, chat, and how pricing works behind the scenes.
If you just want the fastest setup, follow these steps in order and then come back to the deeper sections when you need more detail.
Use the registration flow, then open the confirmation link from the email before you try to log in.
Open the import page, pick the target list, and then use single cards, a public deck URL, or a pasted list.
Use the search box, pagination, and filters to make sure the imported cards look correct.
When two users want cards from each other, CardSwap suggests a trade, lets one side initiate it, and keeps the chat right next to the trade steps.
The import page is built so you can choose one method or combine a queued single-card list with a pasted deck list. All imported cards go into either your offers or your wishlist for that submit.
Start typing a card name, choose the exact printing, pick finish, condition, language, and quantity, then add it to the queue below. The queue is only written to your account when you submit the form.
You can import public Archidekt and Moxfield deck URLs. CardSwap reads the deck, turns it into import lines, and pushes those cards into the selected target list.
If a public Moxfield request is blocked, you can still export the list from Moxfield and paste it manually.
Paste deck lines from Moxfield or Archidekt directly into the text area. This is also the best fallback when a platform URL is private or rate-limited.
At the top of the form you choose whether the import belongs in offers or wishlist. You can append to the existing list or replace that entire list during the same import.
Large imports usually need shortcuts. That is why the import page lets you choose a default condition and default language for the whole submit. Explicit values on a single line always win over the default.
1 Lightning Bolt (CLB) 187 *F* [LP] [DE]
1 Sol Ring (CMM) 680
1 Counterspell (2XM) 51 [NM]In that example, the first line is foil, Lightly Played, and German. The second line inherits your chosen defaults if you set any. The third line keeps Near Mint even if the import default says something else.
Magic trades often break down when people mean different printings. CardSwap therefore keeps the exact print visible from import through dashboard, matching, and chat.
Whenever set code and collector number are known, CardSwap treats that exact print as the real identity of the card instead of only the name.
Normal, foil, and etched are stored separately. Some variants even have their own collector number, so the exact print still stays correct if the etched version is a separate listing.
CardSwap supports Near Mint, Lightly Played, Moderately Played, Heavily Played, Damaged, or not specified. Wishlist matches only become strict when a wishlist card actually requests a condition.
Language works the same way as condition. If a wishlist entry does not ask for a specific language, matching stays flexible instead of becoming needlessly strict.
Once your lists grow, the dashboard becomes the main control surface for checking whether imports look right and for finding cards quickly.
The search field is focused on card names only. That keeps it fast and predictable when you know which card you want to find.
Offers and wishlist each have their own pagination. That keeps both lists usable even when a user has hundreds or thousands of cards.
Color, type, rarity, and frame variant filters come from cached Scryfall print metadata so the dashboard can filter locally without live price lookups.
A card counts as Regular Frame when it is not tagged as extended art, borderless, showcase, or full art in the cached print metadata.
CardSwap does not suggest random swaps. It first looks for reciprocal demand and then tries to find a reasonably balanced combination based on cached prices.
A match only starts if user A offers something user B wants and user B offers something user A wants.
If a wishlist card specifies set and collector number, matching uses that exact print. Name-only fallback is only used when a wishlist entry is less specific.
After both sides have candidate cards, CardSwap compares grouped values and tries to stay within a reasonable tolerance so one side does not massively overpay.
The conversation is shown next to the selected trade suggestion so users can negotiate the final details without leaving the context of the match.
New incoming chat messages show up as unread badges in the navigation and on the relevant match card. Opening that trade marks those messages as read.
CardSwap now separates a raw match suggestion from the actual trade process. That keeps ratings fairer and gives users a way to report scammers even if a trade never finishes cleanly.
A match starts as a suggestion only. One trader must actively initiate the trade before the other side can accept or decline it.
The other trader can now accept or decline the exact proposed swap. This prevents drive-by ratings on trades that never really started.
If the requester changes their mind before acceptance, they can cancel the pending request and the trade returns to a normal suggestion.
After acceptance, each side marks their shipment and later confirms receipt. Once both sides confirm receipt, the trade is completed and the involved cards are removed from offers and fulfilled wishlist entries.
Completed trades can be rated once. Problem reports open after a trade was accepted, so users can still report ghosting, no shipment, wrong cards, or misstated condition before the trade ever reaches completion.
Archived matches stay readable in the Trading Center so you can review the exact cards and chat history later, even after the active workflow is finished.
Problem reports land in an admin dispute queue. That lets moderation look at the report, the match, and the user history before deciding whether the complaint should count against the account.
CardSwap currently pulls pricing from Scryfall and stores the result in a local price cache instead of asking Scryfall on every page load.
The app reads print data and USD prices from Scryfall card responses. Price caching is keyed to the observed print, usually by card name, set code, and collector number.
Caching keeps the dashboard and match views fast and avoids turning every user request into an external API request. That matters a lot once collections get larger.
A background sync job can refresh stale prices in controlled batches. That means page loads keep reading from cache while refreshes happen separately.
The refresh job can prioritize cards from the newest observed sets first, because those are often the prints users trade most actively right after release.
For players who like the technical details, here is the short architecture version of what happens under the hood.
CardSwap is a Flask app with SQLAlchemy models and Alembic migrations. The project is prepared for PostgreSQL in production and can fall back to SQLite locally.
Public deck URLs are turned into plain import lines first. That makes URL imports, pasted lists, and queued single-card entries flow through the same parser and batch processing steps.
Matching checks reciprocal demand, respects print details when available, and then compares grouped card values to avoid obviously unfair suggestions.
The interface supports German and English through Flask-Babel so core pages, import flows, and messages can stay consistent across both languages.
In production, CardSwap expects a real secret key, secure cookies, and a shared rate-limit store such as Redis instead of per-process memory limits.
The other user may not want that exact print, or the candidate trade may be too unbalanced to pass the value tolerance check.
That usually means the cache entry is still pending, stale, or the exact print could not be refreshed cleanly yet. The app can still store the card even before the price is ready.
Yes. The staged single-card queue is meant for that. Add only the prints you want and submit them into offers or wishlist without importing the whole deck.
Start with your wishlist, then import a few easy trade offers, and only after that go to matches. It is the quickest way to see the app working end to end.
CardSwap uses request throttling on login, registration, and password-reset requests, plus hidden honeypot fields on selected forms to catch simple bots without annoying normal users.
Yes, once Google sign-in is configured you can use the Google button on the login or registration page. Verified Google emails can create a new CardSwap account automatically or link to an existing account with the same email address.
CardSwap includes dedicated terms, privacy, and legal notice pages in the footer. Read them before live trading, especially because price references, trade suggestions, and beta features can still be imperfect.