Skip to content

Market Data Guide

The Market Data tab is where you populate the prices PrivateACB uses to convert your transactions into your reporting currency. Every taxable disposal needs a price on the disposal date; every income receipt (staking, mining, airdrops) needs a price on the receipt date; every foreign-currency trade needs a fiat exchange rate on the trade date. If any are missing, ACB calculations are blocked.

There are two kinds of price data:

  1. Exchange rates — fiat-to-fiat conversions (USD → CAD, USD → AUD, etc.) — needed when your exchange traded in a different currency from your tax jurisdiction.
  2. Cryptocurrency prices — crypto-to-fiat prices on a specific date — needed when your transaction has no recorded purchase price (income receipts, swap legs without a base price, etc.).

Why market data matters:

  • Tax authorities require figures in your local currency (CAD / USD / AUD / GBP)
  • Many exchanges trade in USD even for non-US users
  • Income transactions (staking, mining, airdrops) have no purchase price — the engine values them at FMV on the receipt date
  • Missing market data blocks ACB calculations at the preflight stage

The Market Data tab renders top to bottom:

  1. Exchange Rates — assets that need fiat conversion appear here
  2. Cryptocurrency Prices — assets that need historical crypto prices appear here
  3. Recent Imports footer — the last 10 fetches across all sources, for verification

Each section uses the same pattern: an asset table with status indicators, a per-asset Action menu, and inline panels that slide in when you start an import.

Market Data Tab

PrivateACB caches one rate per asset per day. The asset table reads in those terms:

  • “3 days needing rates” means three calendar days have transactions but no cached rate
  • “15 days cached” means fifteen calendar days have a rate stored
  • “Date range: 2024-03-12 → 2025-11-08” covers every day the asset has any transaction activity

This is a deliberate shift from older “missing dates” language. A day-by-day model matches how tax authorities expect FX conversion to work — one rate per disposal date — and gives you a precise progress count.

The asset table filters by what your currently selected jurisdiction actually needs:

  • CA: shows assets whose transactions priced in non-CAD currencies need rate conversions
  • US: shows assets whose transactions priced in non-USD currencies need rate conversions
  • AU: shows assets whose transactions priced in non-AUD currencies (CoinGecko serves AUD natively, so often fewer rows here)
  • UK: shows assets whose transactions priced in non-GBP currencies

If you switch jurisdictions in the dashboard controls, the asset table updates to match. An asset that needed USD/CAD conversion under CA may not appear under US — your transactions were already priced in USD natively.


Each row’s Action menu offers three ways to populate rates for that asset:

MethodWhen to useSetup
Bank of Canada (CA) / Federal Reserve (US) — API fetchDefault for the listed jurisdiction. Fast, official, no manual work.BoC: no key needed. FRED: free API key required.
CSV uploadCustom rate sources, unsupported currency pairs (EUR/GBP/etc.), or working offline.Format documented below.
Manual entryOne-off corrections or rare currency pairs without an API source.Inline modal lists the missing days; type a rate per day.

When you click an Action, an inline panel slides in below the row showing the suggested date range, source-specific options, and a Fetch button. The panel computes the date range from your actual transaction dates — there’s no risk of fetching outside what you need.

Free, no API key. Provides the official daily noon rates that CRA accepts for tax filings.

  1. Select 🍁 CA - Canada (CAD) in the jurisdiction selector
  2. Find the asset in the Exchange Rates section
  3. Click ActionBank of Canada
  4. Confirm the date range (auto-suggested from your transactions)
  5. Click Fetch Rates from Bank of Canada

Rate limit: 10 requests/minute. PrivateACB queues requests automatically.

Requires a free API key (one-time setup). Provides H.10 daily reference rates.

  1. Get a key: FRED API Registration — fill the form, copy the key.
  2. Configure in PrivateACB: Settings tab → Data Sources → Currency API Configuration → Federal Reserve → Configure → paste key → Test → Save.
  3. Fetch rates: Market Data → Action → Federal Reserve → confirm date range → Fetch Rates.

Rate limit: 120 requests/minute.

Supports any currency pair the file specifies. PrivateACB accepts the format below; column order is auto-detected.

date,from_currency,to_currency,rate
2024-01-01,USD,CAD,1.3500
2024-01-02,USD,CAD,1.3525
2024-01-03,USD,CAD,1.3480
ColumnFormat
dateYYYY-MM-DD
from_currency3-letter ISO code
to_currency3-letter ISO code
rateDecimal — units of to_currency per 1 unit of from_currency

Action → CSV Upload → drop or browse the file → review preview → Import.

For one-off rates or unusual currency pairs that have no API source.

Action → Manual Entry opens a modal listing every day the asset needs a rate. Type the rate inline; Enter or ↓ / ↑ moves to the next row. Click Save when done.


The Cryptocurrency Prices section shows assets whose transactions have no recorded price — staking rewards, airdrops, deposits without a purchase event, swap legs that came in without quote currency. PrivateACB needs a market price to value these in your reporting currency.

SourceBest forAPI keyCoverage
CoinGeckoRecent prices (last 365 days, top 100+ coins)Free demo key required365 days on the demo plan
CryptoCompareHistorical prices (dates older than 365 days, broader coin coverage)None requiredBack to 2010 for most coins

When you click Fetch Prices on an asset, PrivateACB auto-routes each missing day to whichever source can serve it — recent days go to CoinGecko (if a key is configured), older days fall through to CryptoCompare. The before-fetch dialog shows the per-source split (e.g., “CoinGecko: 180 days, CryptoCompare: 45 days”).

A Fetch All Missing button does the same for every asset on the table at once.

  1. Get a key: CoinGecko API — sign up for the free Demo plan, copy the key (it starts with CG-).
  2. Configure in PrivateACB: Settings → Data Sources → Currency API Configuration → CoinGecko → Configure → paste → Test → Save.

Demo plan limits: 30 calls/min, 10,000 calls/month, 365 days of historical data.

CryptoCompare works out of the box without an API key. Free tier: 100,000 calls/month — well above what most users will hit. An optional API key in Settings raises the cap if you have a very large dataset.

For assets neither source supports (typically tiny altcoins or experimental tokens), the Action menu offers Manual Entry. The modal lists every day the asset needs a price, asking for the price in your reporting currency. Use Enter or ↓ / ↑ to move between rows.

Where to find historical prices manually:

  • CoinGecko website — search the asset, open Historical Data, find the date
  • CoinMarketCap — historical charts back many years
  • The exchange’s own trade history — often the most reliable source for niche coins

Both sections use the same status semantics:

StatusIconMeaningAction
CompleteAll required days have dataNone — ready for calculation
Partial⚠️Some days missingClick Action → fetch the gaps
None / Needs🔴No data at allClick Action → fetch immediately
UnavailableAsset not on either price source (crypto only)Use manual entry

An asset disappears from its section the moment it reaches Complete — the table is a working list, not an inventory.


The footer shows your last 10 imports across all sources, jurisdictions, and asset types:

Recent Imports
🍁 USD → CAD | Bank of Canada | 365 rates | 2 hours ago
🦎 BTC/CAD | CoinGecko | 180 prices | 1 day ago
📁 Manual CSV | 45 rates | 3 days ago
✏️ SOL/CAD | Manual entry | 8 prices | 5 days ago
IconSource
🍁Bank of Canada
🏛️Federal Reserve (FRED)
🦎CoinGecko
🔵CryptoCompare
📁CSV upload
✏️Manual entry

Useful for verifying that a fetch actually landed in the database — particularly after a slow or partial fetch where the on-screen status is ambiguous.


Settings → Data Sources → Currency API Configuration is the single place to manage the two keys PrivateACB uses:

ServiceKey requiredWhere to get itStored as
Federal Reserve (FRED)Yes (free)fred.stlouisfed.org/docs/api/api_key.htmlDPAPI-encrypted in Windows Registry
CoinGeckoYes (free demo plan)coingecko.com/en/apiDPAPI-encrypted in Windows Registry
Bank of CanadaNon/an/a
CryptoCompareOptional (raises rate limit)cryptocompare.com/coins/guides/how-to-use-the-api/DPAPI-encrypted if provided

API keys are never saved in your encrypted database file — they live in the Windows Registry under DPAPI, which is bound to your user account on this machine. If you move databases between machines, you’ll need to re-enter the keys on the new one.


The end-to-end flow Market Data participates in:

  1. Import transactions via the Import wizard
  2. Open Market Data — the asset tables now show what’s missing
  3. Fetch / upload / enter rates and prices until both sections clear
  4. Open the ACB Calculator — preflight should now pass
  5. Calculate — the engine reads from asset_conversions (populated by Market Data) and market_rates (populated by the same source)
  6. Generate reports — figures match the dashboard

If preflight blocks at step 4 with “Cost basis is unknown for a transfer-in”, that’s a different problem (an unmatched deposit, not missing prices). See the Preflight Errors Guide for resolution.


”Missing conversion rates” warning on the dashboard

Section titled “”Missing conversion rates” warning on the dashboard”

You have transactions whose dates lack a fiat rate. Open Market Data, look at the Exchange Rates section, and fetch the gaps. The dashboard re-checks on every refresh.

The asset isn’t on either CoinGecko or CryptoCompare’s supported list. Use Action → Manual Entry and source prices from the asset’s own page on a price aggregator or the exchange you bought it on.

The rates already existed for those days — duplicates are silently skipped. Confirm by looking at the Recent Imports footer; the prior import is listed there.

”Connection test failed” when configuring an API key

Section titled “”Connection test failed” when configuring an API key”

Verify the key is correct (CoinGecko’s starts with CG-; FRED’s is a 32-character hex string), check internet connectivity, and wait one minute before retrying — most transient failures are upstream rate limits.

Two common causes:

  • Wrong jurisdiction — you fetched USD→CAD rates but the active jurisdiction is the US (which needs the inverse). Switch jurisdiction or fetch the correct direction.
  • Asset prices missing too — Exchange Rates and Cryptocurrency Prices are independent. An asset can have all its FX rates and still need a crypto price for a staking-reward day.

Long date ranges naturally take time. The progress indicator updates as days are fetched. PrivateACB queues requests under each API’s rate limit; there’s no manual tuning to do.

Recent Import shows fewer rates than expected

Section titled “Recent Import shows fewer rates than expected”

The fetch hit a non-trading day or a holiday and the source had no data. Bank of Canada has no rate for weekends; FRED skips US federal holidays. Surrounding days flow through normally — for the gap day specifically, the calculator falls back to the prior trading day’s rate.


  1. Set up API keys before your first import. FRED + CoinGecko take five minutes each. Doing this once means every subsequent import is one-click.
  2. Visit Market Data after every import. Imports no longer pre-populate prices. Make this a reflex.
  3. Don’t pre-fetch. PrivateACB only asks for rates and prices on dates you actually have transactions for. Pre-fetching a year “just in case” costs API credits and accomplishes nothing.
  4. Confirm via Recent Imports. A fetch that looks successful but isn’t reflected in Recent Imports is a clue that the source returned no data. Re-check the date range.
  5. Use CSV upload for bulk corrections. Easier than typing 30 manual rates one at a time.
  6. Switch jurisdictions to verify cross-coverage. If you file in two jurisdictions (e.g., dual citizen), each needs its own rate set.

NeedSourceWhere in PrivateACB
USD → CAD rateBank of CanadaMarket Data → Exchange Rates → Action → Bank of Canada
CAD → USD rateFREDMarket Data → Exchange Rates → Action → Federal Reserve
Recent crypto priceCoinGeckoMarket Data → Cryptocurrency Prices → Fetch
Old crypto price (>365 days)CryptoCompare (auto)Same — auto-routed to CryptoCompare
Custom rate setCSV uploadMarket Data → Action → CSV Upload
Niche altcoin priceManual entryMarket Data → Action → Manual Entry


Last Updated: May 2026 PrivateACB Version: 2.8.1