How to get crypto prices into Google Sheets or Excel

An official add-on, a keyless CSV, or a script of your own. Why a Google Sheet shares its rate limit with strangers, and what a daily price is dated.

Install CoinGecko's own add-on, which gives you =COINGECKO() in Google Sheets and =CG.PRICE() in Excel, and give it a free Demo key. Avoid keyless recipes for anything live: a Google Sheet fetches from Google's shared servers, so other people's sheets spend the same per-IP allowance. Ask for coin IDs rather than tickers, fetch a column in one call rather than one per cell, and treat the number as minutes to hours old.

The short way

Use the vendor's own add-on. CoinGecko publishes one for Google Sheets and one for Excel, and both run on a CoinGecko API key — the free Demo key is enough to start. Install from the Google Workspace Marketplace or the Excel add-ins store, paste the key into the add-on's settings, and type a formula.

Google Sheets (CoinGecko for Sheets)
=COINGECKO("id:bitcoin")                    latest USD price, by coin ID
=COINGECKO("id:ethereum", "2026-09-01")     price at 00:00 UTC on that date
=COINGECKO("top:20")                        top 20 by market cap

Excel (CoinGecko add-in)
=CG.PRICE("bitcoin")                        latest USD price
=CG.HISTORY("bitcoin", "2026-09-01")        historical USD price
=CG.TOP(20)                                 ranked table, spills down and right

Two habits from the start. Use the id: form, which CoinGecko's own documentation calls the most reliable, rather than a ticker. And keep the columns next to the formulas empty: the table functions spill into adjacent cells and fail if something is already there.

The Demo plan is the free tier described on the card — a monthly credit allowance, a per-minute ceiling, 365 days of history and a required attribution line. For a watchlist of a few dozen coins that refreshes a few times a day, that is plenty.

What the options are

The official add-on. As above. Its advantage over everything below is that the rate limit you hit is your key's, not an IP address's. Sheets caches the formulas for one to two hours; the add-on's sidebar has a Refresh All Data button, and the Excel task pane has the same.

A keyless CSV and a built-in function. Google Sheets' IMPORTDATA reads any URL that returns CSV, and Coin Metrics' community API returns CSV when asked, with no key and no account:

=IMPORTDATA("https://community-api.coinmetrics.io/v4/timeseries/asset-metrics?assets=btc,eth&metrics=ReferenceRateUSD&frequency=1d&start_time=2026-09-01&format=csv")

That returns three columns — asset, time, value — one row per asset per day, and it is the only route here that needs nothing installed. It suits a daily series; it is not a live quote, and the licence on community data is non-commercial.

Your own custom function. When an add-on does not return the field you need, Apps Script (Extensions, then Apps Script) lets you write the formula yourself. The one design choice that matters is to take a range and make one request for it, rather than one request per cell:

// =CGPRICES(A2:A40) — one request for the whole column of CoinGecko IDs.
// Store the Demo key as the script property CG_DEMO_KEY, not in this file.
function CGPRICES(ids) {
  const list = [].concat(ids).flat().filter(String);
  const key = PropertiesService.getScriptProperties().getProperty('CG_DEMO_KEY');
  const url = 'https://api.coingecko.com/api/v3/simple/price'
    + '?vs_currencies=usd&include_last_updated_at=true'
    + '&ids=' + encodeURIComponent(list.join(','));
  const res = UrlFetchApp.fetch(url, { headers: { 'x-cg-demo-api-key': key } });
  const data = JSON.parse(res.getContentText());
  return list.map(id => data[id]
    ? [data[id].usd, new Date(data[id].last_updated_at * 1000)]
    : ['', '']);
}

The endpoint takes up to 515 IDs a request, and the second column is the time CoinGecko last updated the price — keep it. The same shape works against CoinMarketCap, which takes its key in an X-CMC_PRO_API_KEY header and accepts comma-separated IDs; its free Basic plan includes commercial use, which CoinGecko keeps for its paid plans and Coin Metrics' community licence excludes.

A metrics add-in that also does prices. Artemis sells a plugin for Excel and Google Sheets whose one formula covers price, market cap and the fundamentals it is really bought for. =ART("BTC", "PRICE") is the latest price; =ARTRANGE("BTC", "PRICE", "2026-01-01", "2026-09-01") returns the whole range as one call. It is a paid product, and worth it only if the sheet needs the protocol metrics too.

The built-ins. Google's GOOGLEFINANCE and Excel's Currencies data type are both documented for currency pairs, and neither document mentions crypto. Microsoft limits currency pairs to Microsoft 365 accounts; both vendors say the data may be delayed and is not for trading. Do not build a sheet you depend on around undocumented coverage.

Where this breaks

A Google Sheet does not fetch from your computer. IMPORTDATA, IMPORTXML, and anything written in Apps Script run on Google's servers, and many unrelated spreadsheets leave from the same addresses. A keyless API that limits by IP is counting all of them. CoinGecko's documentation states it plainly: "Rate limit errors may occur due to shared IP addresses among Google Sheets users. For reliable performance, use a dedicated API key with a paid plan." Coin Metrics' community tier is limited per IP as well. This is why a keyless recipe copied from a forum works on the first afternoon and returns errors at random afterwards: nothing changed in your sheet, and nothing you do in it will fix it. Every error also counts — CoinGecko includes 4xx and 5xx responses in the per-minute limit, so a sheet that retries on failure digs itself deeper. The families of limit, and what each is really counting, are in rate limit.

One cell is one call, and Google counts the calls too. Google's documentation says each use of a custom function is a separate call to the Apps Script server. A consumer Google account gets 20,000 URL fetches a day and a Workspace account 100,000; no more than 30 scripts run at once per user; and a custom function that has not returned within 30 seconds shows #ERROR!. Four hundred cells each holding a one-coin custom function can be four hundred fetches per recalculation, and the upstream API meters every one against your credit allowance as well. Batch: one range in, one request out, a two-dimensional array back. Artemis gives the same advice about its own formulas, and adds a catch: in a shared sheet, the calls count against the owner's quota and run on the owner's credentials, so a sheet stops working for everyone when its owner's subscription lapses.

A ticker is not a coin. Symbols are not unique. CoinMarketCap's documentation says so and says what it does about it — when several assets share a symbol, it returns the one with the highest market cap — and symbols also change when a project rebrands. A formula keyed on a ticker can quietly start returning a different asset. Key the sheet on each vendor's own ID, and keep a column mapping IDs to the tickers you want to see.

A price in a cell is already old. Google recalculates the import functions hourly and delays GOOGLEFINANCE by up to 20 minutes. CoinGecko's add-on inherits a Sheets cache of one to two hours, and the price behind it is itself refreshed every 60 seconds on the free and keyless tiers, every 20 seconds on paid ones. None of that is visible in the cell. Pull the source's timestamp alongside every price, as the script above does, and read the two together.

A daily price has a date convention, and they differ. CoinGecko's historical formula returns the price at 00:00 UTC on the date you give it; Artemis documents its daily price at midnight UTC too. Coin Metrics publishes the same number under two names with different stamps: PriceUSD is the price as of the end of the UTC day, while ReferenceRateUSD at a daily frequency is stamped at the start of it. Pulled today, PriceUSD for 22 September 2026 and ReferenceRateUSD for 23 September are the same figure to ten decimal places. Mix the two, or mix them with a column typed in your local time zone, and every row is a day out. Which aggregate each vendor is publishing in the first place is the subject of where the Bitcoin price comes from.

The key lives wherever the sheet goes. IMPORTDATA takes a URL and nothing else, so a keyed URL puts the key in the formula — the query-string placement that CoinGecko and CoinMarketCap both recommend against — and every copy of the sheet carries it. Use an add-on's settings or a script property instead, and keep the sheet itself free of credentials before you share it.

Free to import is not free to republish. CoinGecko requires attribution on every plan, including the free one; Coin Metrics' community data is licensed non-commercial. A personal watchlist is inside both. A sheet circulated to clients, or published as a dashboard, is a redistribution question, and what exchange API terms actually let you do covers the venue side of the same problem.

If you outgrow this

The sign is a sheet that has become an application: hundreds of assets, refreshes you need on a schedule rather than on open, or other people depending on the numbers. At that point the spreadsheet is the wrong place for the fetch. Pull on a schedule from a script or a small job of your own, write to a file or a database, and let the sheet read that — the rate limit is then yours, the timestamps are stored rather than recomputed, and the key never enters the document.

If what you actually need is a candle series rather than a last price, that is a different task: pulling OHLCV from an exchange covers it. If you need one number to settle a contract or mark a book, a spreadsheet formula over a free tier was never the right source; that is a reference-rate purchase, and Coin Metrics and Kaiko are where it starts.

The tools named above

In the order this page puts them in, which is an editorial judgement and not a ranking anyone paid for.

  1. CoinGecko API

    First-party add-ons for both spreadsheets — =COINGECKO() in Sheets, =CG.* in Excel — on a free Demo key, plus a batch price endpoint for your own script.

    Prices, market data and onchain DEX data for 18,000+ coins, via REST, websocket or MCP.

    $35/moFree tier

  2. Coin Metrics

    A keyless community endpoint that answers in CSV, so a daily reference-rate series lands in Google Sheets through the built-in IMPORTDATA with no add-on at all.

    Institutional reference rates, exchange market data and network metrics behind one API.

    Free tier onlyFree tier

  3. CoinMarketCap API

    The other free key, for a custom function you write yourself; its Basic plan carries commercial-use rights, which matters for a sheet used at work.

    Prices, rankings, DEX and derivatives data, metered by rows returned rather than by call.

    $35/moFree tier

  4. Artemis

    One =ART() formula for prices beside fees, revenue and TVL in Excel and Sheets, with ARTRANGE to pull a whole date range as a single call.

    Chain and protocol fundamentals — fees, revenue, users — one definition everywhere.

    $100/moFree tier

FAQ

Does GOOGLEFINANCE work for Bitcoin?

Google's help page for GOOGLEFINANCE documents currency pairs and says nothing about crypto assets, so anything it returns for one is behaviour you cannot point to a document for. What the page does say applies either way — quotes are not sourced from all markets, may be delayed up to 20 minutes, are not for trading, and historical results cannot be read through the Sheets API or Apps Script.

Why does my sheet show "Loading..." or a rate-limit error when I have barely used it?

Because the request did not come from you. A formula in Google Sheets fetches from Google's servers, and a keyless API that limits per IP address is counting every sheet that shares that address. CoinGecko's documentation says so directly and recommends a dedicated key on a paid plan for reliable performance. A key moves you onto your own allowance; retrying harder only spends the shared one.

Can I keep my API key out of the formula?

Not with IMPORTDATA, whose only argument is the URL, so the key has to ride in the URL — the placement both CoinGecko and CoinMarketCap advise against. An add-on stores it for you, and an Apps Script custom function can read it from script properties and send it as a header. Either way the key belongs to whoever owns the sheet, and a shared sheet spends the owner's allowance.

How often does a spreadsheet price refresh?

Less often than it looks. Google recalculates IMPORTDATA and the other import functions hourly; CoinGecko's add-on notes that Sheets caches its formulas for one to two hours, with a sidebar button to force a refresh; and the upstream price itself is cached — every 60 seconds on CoinGecko's free and keyless tiers. Put the source's own timestamp in the sheet next to the number.

Sources

  1. Common Errors & Rate Limit — CoinGecko, read
  2. CoinGecko for Google Sheets — CoinGecko, read
  3. CoinGecko for Microsoft Excel — CoinGecko, read
  4. Coin Price by IDs (simple/price) — CoinGecko, read
  5. Authentication (Demo API) — CoinGecko, read
  6. Change a spreadsheet's locale, time zone, recalculation and language — Google, read
  7. IMPORTDATA — Google, read
  8. GOOGLEFINANCE — Google, read
  9. Quotas for Google Services — Google,
  10. Custom Functions in Google Sheets — Google, read
  11. Get a currency exchange rate — Microsoft, read
  12. Coin Metrics API v4 — community rate limits, format parameter, licence — Coin Metrics, read
  13. Price — PriceUSD and its timestamp convention — Coin Metrics, read
  14. Standards and Conventions — CoinMarketCap, read
  15. Authentication — CoinMarketCap, read
  16. Syntax and Formulas — =ART() and =ARTRANGE() — Artemis, read
  17. Common Problems with Google Sheets — Artemis, read

The catalogue next door

This page names a handful of products. The rest of them are in Crypto Market Data APIs, each filled in against the same schema, with the fields to narrow it yourself.

Last updated . Corrected in place — an endpoint that moves is a bug on this page, not a new post.