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.
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
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
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
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
- Common Errors & Rate Limit — CoinGecko, read
- CoinGecko for Google Sheets — CoinGecko, read
- CoinGecko for Microsoft Excel — CoinGecko, read
- Coin Price by IDs (simple/price) — CoinGecko, read
- Authentication (Demo API) — CoinGecko, read
- Change a spreadsheet's locale, time zone, recalculation and language — Google, read
- IMPORTDATA — Google, read
- GOOGLEFINANCE — Google, read
- Quotas for Google Services — Google,
- Custom Functions in Google Sheets — Google, read
- Get a currency exchange rate — Microsoft, read
- Coin Metrics API v4 — community rate limits, format parameter, licence — Coin Metrics, read
- Price — PriceUSD and its timestamp convention — Coin Metrics, read
- Standards and Conventions — CoinMarketCap, read
- Authentication — CoinMarketCap, read
- Syntax and Formulas — =ART() and =ARTRANGE() — Artemis, read
- 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.