Skip to content

Crypto Price Fetching Guide

PrivateACB automatically fetches historical cryptocurrency prices to calculate your cost base accurately. When you buy or sell crypto, you need the price in your reporting currency (CAD, USD, AUD, or GBP) on that specific date.

Prices come from three free, tiered sources — CoinGecko for recent dates, and DefiLlama + Binance for deep history — with automatic routing between them. None of them is required to be configured: the deep-history sources are keyless and work out of the box.

Why crypto prices matter:

  • ACB calculations require prices in your reporting currency
  • Most exchanges only record prices in their trading currency (often USD)
  • Missing prices will block ACB calculations
  • Manual price lookup is tedious for hundreds of transactions

What this guide covers:

  • The three price sources and how auto-routing splits dates between them
  • Using the Market Data tab to fetch prices
  • How deep-history (>365 day) prices are cross-rated into your reporting currency
  • Entering prices manually for gaps or unsupported assets

SourceCoversAPI keyReturns
CoinGeckoRecent dates (within the last 365 days), or all dates with a Pro keyFree Demo key optional; Pro key for full historyPrice directly in your reporting currency
DefiLlamaDeep history (older than 365 days) for top-100 mapped coinsNone (keyless)USD — cross-rated to your currency
BinanceFallback for any deep date DefiLlama misses, plus coins not on CoinGeckoNone (keyless)USD — cross-rated to your currency

PrivateACB checks each date in an asset’s range and routes it to whichever source can serve it. One Fetch Prices click covers the whole range — you don’t pick sources manually.


Step 1 (optional): Get a Free CoinGecko API Key

Section titled “Step 1 (optional): Get a Free CoinGecko API Key”

A CoinGecko key is optional. Without one, CoinGecko’s keyless endpoint still serves recent dates, and DefiLlama/Binance cover deep history. A key mainly raises your rate limit; a Pro key additionally unlocks full CoinGecko history (removing the 365-day boundary on that source).

  1. Visit CoinGecko API
  2. Click “Get Your API Key”
  3. Create a free account (Demo plan) — or subscribe to a Pro plan for full history
  4. Copy your API key (Demo keys start with CG-)

Demo Plan Limits:

  • 30 calls per minute
  • 10,000 calls per month
  • 365 days of historical data (deep history is served by DefiLlama/Binance instead)

Step 2 (optional): Configure the CoinGecko Key in PrivateACB

Section titled “Step 2 (optional): Configure the CoinGecko Key in PrivateACB”
  1. Go to Settings tab
  2. Open Data SourcesCurrency API Configuration
  3. Find “CoinGecko” row → Click “Configure”
  4. Paste your API key → Click “Save API Key”
  5. Click “Test” to verify connection

Success message: “CoinGecko Demo API connected successfully”

DefiLlama and Binance need no configuration — they appear as keyless, always-ready sources in the same list.


  1. Go to Market Data tab (Ctrl+2)
  2. Select your jurisdiction: 🍁 CA, 🇺🇸 US, 🇦🇺 AU, or 🇬🇧 UK
  3. Scroll to Cryptocurrency Prices table
  4. Click “Fetch Prices” for an individual asset, or “Fetch All Missing” to fetch everything at once
  5. A per-source breakdown shows after fetching (e.g., “CoinGecko: 37 prices, DefiLlama: 675 prices”)
  6. A spinner shows while the fetch runs — deep-history ranges also pull the FX rates needed for cross-rating, so they can take a little longer

Done! Prices are now available for ACB calculations.


When you click Fetch Prices, PrivateACB sorts the asset’s missing dates into two buckets and serves each from the right source:

  • Within the last 365 days (or any date if you have a CoinGecko Pro key) → CoinGecko, which returns the price directly in your reporting currency.
  • Older than 365 days → the deep-history tier: DefiLlama first (for coins mapped on CoinGecko), then Binance ({SYMBOL}USDT) for anything DefiLlama missed and for coins not on CoinGecko.

Deep history returns USD — and is cross-rated for you

Section titled “Deep history returns USD — and is cross-rated for you”

DefiLlama and Binance return prices in USD. PrivateACB cross-rates them into your reporting currency using the same FX engine that powers the Exchange Rates table:

  • USD reporting (US): no conversion needed — the USD price is used directly.
  • CAD / AUD / GBP reporting: PrivateACB fetches the matching USD→CAD / USD→AUD / USD→GBP rate from the Bank of Canada (keyless) for each date and multiplies. For example, a SOL price of 20.76 USD on 2023-07-10 becomes 27.58 CAD (× 1.3284) or 31.16 AUD (× 1.5012).

This happens automatically during the fetch — you’ll see a log line like “Fetched 689 USD→AUD FX rate(s) (Bank of Canada) for the deep-history price cross-rate.”

The before/after dialog shows the per-source split so you always know what was served from where.


Market Data Tab: Cryptocurrency Prices Section

Section titled “Market Data Tab: Cryptocurrency Prices Section”

The Cryptocurrency Prices table appears in the Market Data tab (Ctrl+2), below the Exchange Rates table.

Asset Table:

AssetStatusTransactionsDate RangeAction
BTC✅ Complete45Jan 2023 - Dec 2025Fetch
ETH⚠️ Gaps23Mar 2023 - Nov 2025Fetch
SOL🔴 None12Jun 2024 - Jan 2026Fetch
DOGE⚪ Unavailable5Aug 2024 - Dec 2025Manual

StatusIconMeaning
CompleteAll transaction dates have prices
Gaps⚠️Some dates have prices, some don’t
None🔴No prices cached yet
UnavailableAsset reachable on none of the sources (manual entry required)

When you click “Fetch” for an asset:

  1. PrivateACB identifies all transaction dates needing prices
  2. Routes recent dates to CoinGecko and deep dates to DefiLlama → Binance
  3. Cross-rates any USD deep-history prices into your reporting currency via Bank of Canada FX
  4. Stores prices in your local database and updates the asset status

Example log output:

[INFO] Fetched 689 USD→AUD FX rate(s) (Bank of Canada) for the deep-history price cross-rate
[INFO] Fetched 675 prices for SOL/AUD via DefiLlama (deep history)
[INFO] Price fetch complete: 712/712 prices stored for SOL/AUD

Each source self-throttles, and the Fetch All Missing loop processes one asset at a time (never in parallel), so you never need to manage limits manually:

  • CoinGecko Demo: 30 calls/minute, queued with exponential backoff on failure
  • DefiLlama: requested in chunks (50 dates per call) to stay well within its limits
  • Bank of Canada: cached responses, retry-with-backoff, no documented hard limit

PrivateACB includes mappings for the top 100+ cryptocurrencies including:

  • Bitcoin (BTC), Ethereum (ETH), Solana (SOL)
  • Cardano (ADA), Polygon (MATIC), Avalanche (AVAX)
  • Chainlink (LINK), Uniswap (UNI), Aave (AAVE)
  • Stablecoins: USDT, USDC, DAI, BUSD
  • And many more…

Coins on this list use DefiLlama for deep history. Coins not on the list can still be served by Binance if a {SYMBOL}USDT pair exists there. Only assets reachable on none of the sources show ⚪ Unavailable and need manual entry.


Use manual entry when:

  • Asset is reachable on none of the automatic sources (shows ⚪ Unavailable)
  • A deep-history date predates the 2017 FX floor in a CAD/AUD/GBP report
  • A US report needs a coin that’s neither on CoinGecko nor reachable via Binance
  • You prefer a specific price source, or the auto price differs from your exchange’s price

  1. In the Cryptocurrency Prices table, click “Manual” for the asset
  2. A modal appears: “Manual Price Entry”
  3. Fill in the form:
    • Date: Select the transaction date
    • Asset: Pre-filled (e.g., SOL)
    • Currency: Your reporting currency (CAD/USD/AUD/GBP)
    • Price: Enter the price per unit
    • Source: Optional - note where you found this price
  4. Click “Save Price”
  5. Repeat for each missing date

Example:

Date: 2024-07-15
Asset: SOL
Currency: CAD
Price: 195.50
Source: CoinGecko website lookup

If you need to look up old prices manually:

CoinGecko Website:

  1. Go to coingecko.com
  2. Search for your asset (e.g., “Solana”)
  3. Click “Historical Data” tab
  4. Find the date you need
  5. Note the price in your currency

Other sources:

  • CoinMarketCap historical data
  • Your exchange’s trade history (shows exact price you paid)
  • Blockchain explorers (for on-chain transactions)

For multiple missing dates, you can:

  1. Prepare a list of dates and prices
  2. Enter each one through the manual entry modal
  3. The cache updates immediately

You can also import prices in bulk via Price CSV import from the Market Data action bar.


After fetching, check the asset status:

  • Complete - Ready for ACB calculation
  • ⚠️ Gaps - Some dates still need prices (check date range)
  1. Go to ACB Calculator tab (Ctrl+4)
  2. Configure your jurisdiction, method, and tax year in the Config Bar
  3. Select your asset(s) in the Asset Table
  4. Click “Calculate”

Prices are automatically applied during calculation.


For general troubleshooting (API key configuration, “asset shows unavailable”, partial prices), see the Market Data Guide — Troubleshooting section.

Deep-History Dates Show as “Not Fetched”

Section titled “Deep-History Dates Show as “Not Fetched””

Symptom: After fetching, some older dates remain uncovered and are reported as needing manual entry.

Likely causes:

  1. Pre-2017 dates in a CAD/AUD/GBP report — no keyless Bank of Canada FX rate exists to cross-rate the USD deep-history price. Use manual entry for those days.
  2. A coin not on CoinGecko, in a US report — Binance (the unmapped-coin fallback) is unavailable to US users (HTTP 451). Use manual entry or a Price CSV import.
  3. A coin on neither CoinGecko nor Binance — no automatic source has it. Use manual entry.

Solution: use Action → Manual Entry for the days the auto-routing can’t cover, sourcing prices from the asset’s CoinGecko or CoinMarketCap page (their websites carry far more history than their public APIs expose), or import a Price CSV.


Symptom: Prices show ✅ Complete but ACB calculation errors

Possible causes:

  1. Currency mismatch - Fetched prices for one jurisdiction, calculating in another
  2. Weekend/holiday gaps - a source may skip some dates
  3. Fiat rates missing - deep-history cross-rating also needs USD↔(your currency) rates

Solution:

  1. Check the jurisdiction setting matches your fetched prices
  2. Use the Market Data tab to fetch fiat exchange rates (Bank of Canada)
  3. Fill any remaining gaps with manual entry

Symptom: Clicking Fetch doesn’t start a request

Possible causes:

  1. Already fetching - Check for the spinner / progress indicator
  2. No transactions - Asset has no transactions needing prices
  3. All cached - Prices already fetched (status should show ✅)

Solution: Check the status column. If in doubt, close and reopen your database.


For general best practices (API key setup, checking after each import, monitoring API usage), see the Market Data Guide — Best Practices section.


Key Takeaways:

  1. Three sources auto-route — CoinGecko (recent) + DefiLlama and Binance (deep history) — a single Fetch click covers any date range
  2. No keys required for deep history; a CoinGecko key is optional (Pro unlocks full CoinGecko history)
  3. Deep-history prices come back in USD and are cross-rated to your currency via Bank of Canada FX (keyless for CAD/AUD/GBP; USD needs no conversion)
  4. Fetch in the Market Data tab — Cryptocurrency Prices section
  5. Manual entry for assets no source supports, or pre-2017 dates in CAD/AUD/GBP reports
  6. Check status before ACB calculations — all assets should show ✅

Quick Reference:

TaskLocation
Configure API key (optional)Settings (Ctrl+6) → Data Sources → Currency API Configuration → CoinGecko
Fetch pricesMarket Data (Ctrl+2) → Cryptocurrency Prices → Fetch
Manual entryMarket Data (Ctrl+2) → Cryptocurrency Prices → Manual
Check coverageMarket Data (Ctrl+2) → Status column (✅/⚠️/🔴/⚪)

Last Updated: June 2026 PrivateACB Version: 2.9.0