by coingecko
Access CoinGecko REST API with full TypeScript typings, automatic retries, timeout handling, and customizable logging for server‑side JavaScript or TypeScript projects.
Provides a type‑safe, convenience wrapper around the public CoinGecko REST API, enabling developers to request price data, market information, and other cryptocurrency metrics directly from Node.js, Deno, Bun, browsers, or edge runtimes.
npm install @coingecko/coingecko-typescript
import Coingecko from '@coingecko/coingecko-typescript';
const client = new Coingecko({
proAPIKey: process.env['COINGECKO_PRO_API_KEY'],
// demoAPIKey: process.env['COINGECKO_DEMO_API_KEY'], // optional for demo access
environment: 'pro', // or 'demo'
});
// Example: fetch Bitcoin price in USD
const price = await client.simple.price.get({ vs_currencies: 'usd', ids: 'bitcoin' });
console.log(price);
You can also import request/response types for compile‑time safety:
import Coingecko from '@coingecko/coingecko-typescript';
const params: Coingecko.Simple.PriceGetParams = { vs_currencies: 'usd', ids: 'bitcoin' };
const result: Coingecko.Simple.PriceGetResponse = await client.simple.price.get(params);
.asResponse()
or .withResponse()
for custom parsing or header inspection.debug
, info
, warn
, error
, off
) and support for custom logger libraries.fetch
implementation or proxy settings via fetchOptions
.client.get/post/...
for any extra API routes.Q: Do I need a CoinGecko API key?
A: The library works with the free public API, but for higher rate limits you can provide a proAPIKey
(or demoAPIKey
for the demo tier).
Q: How are errors represented?
A: Errors subclass Coingecko.APIError
and expose status
, name
, and headers
. Specific error types map to HTTP status codes (e.g., BadRequestError
for 400).
Q: Can I change the number of retry attempts?
A: Yes. Set maxRetries
globally in the client options or per‑request in the call options.
Q: How do I adjust request timeouts?
A: Use the timeout
option when constructing the client or in individual request options.
Q: What runtimes are supported? A: Web browsers, Node.js 20+, Deno v1.28+, Bun 1+, Cloudflare Workers, Vercel Edge Runtime, and Jest environments.
Q: Is React Native supported?
A: Currently no; the library relies on a standard fetch
implementation not yet available in React Native.
This library provides convenient access to the Coingecko REST API from server-side TypeScript or JavaScript.
The REST API documentation can be found on docs.coingecko.com. The full API of this library can be found in api.md.
It is generated with Stainless.
npm install @coingecko/coingecko-typescript
The full API of this library can be found in api.md.
import Coingecko from '@coingecko/coingecko-typescript';
const client = new Coingecko({
proAPIKey: process.env['COINGECKO_PRO_API_KEY'],
// demoAPIKey: process.env['COINGECKO_DEMO_API_KEY'], // Optional, for Demo API access
environment: 'pro', // 'demo' to initialize the client with Demo API access
});
async function main() {
const price = await client.simple.price.get({ vs_currencies: 'usd', ids: 'bitcoin' });
console.log(price);
}
main()
This library includes TypeScript definitions for all request params and response fields. You may import and use them like so:
import Coingecko from '@coingecko/coingecko-typescript';
const client = new Coingecko({
proAPIKey: process.env['COINGECKO_PRO_API_KEY'],
// demoAPIKey: process.env['COINGECKO_DEMO_API_KEY'], // Optional, for Demo API access
environment: 'pro', // 'demo' to initialize the client with Demo API access
});
const params: Coingecko.Simple.PriceGetParams = { vs_currencies: 'usd', ids: 'bitcoin' };
const price: Coingecko.Simple.PriceGetResponse = await client.simple.price.get(params);
Documentation for each method, request param, and response field are available in docstrings and will appear on hover in most modern editors.
When the library is unable to connect to the API,
or if the API returns a non-success status code (i.e., 4xx or 5xx response),
a subclass of APIError
will be thrown:
const price = await client.simple.price.get({ vs_currencies: 'usd', ids: 'bitcoin' }).catch(async (err) => {
if (err instanceof Coingecko.APIError) {
console.log(err.status); // 400
console.log(err.name); // BadRequestError
console.log(err.headers); // {server: 'nginx', ...}
} else {
throw err;
}
});
Error codes are as follows:
Status Code | Error Type |
---|---|
400 | BadRequestError |
401 | AuthenticationError |
403 | PermissionDeniedError |
404 | NotFoundError |
422 | UnprocessableEntityError |
429 | RateLimitError |
>=500 | InternalServerError |
N/A | APIConnectionError |
Certain errors will be automatically retried 2 times by default, with a short exponential backoff. Connection errors (for example, due to a network connectivity problem), 408 Request Timeout, 409 Conflict, 429 Rate Limit, and >=500 Internal errors will all be retried by default.
You can use the maxRetries
option to configure or disable this:
// Configure the default for all requests:
const client = new Coingecko({
maxRetries: 0, // default is 2
});
// Or, configure per-request:
await client.simple.price.get({ vs_currencies: 'usd', ids: 'bitcoin' }, {
maxRetries: 5,
});
Requests time out after 1 minute by default. You can configure this with a timeout
option:
// Configure the default for all requests:
const client = new Coingecko({
timeout: 20 * 1000, // 20 seconds (default is 1 minute)
});
// Override per-request:
await client.simple.price.get({ vs_currencies: 'usd', ids: 'bitcoin' }, {
timeout: 5 * 1000,
});
On timeout, an APIConnectionTimeoutError
is thrown.
Note that requests which time out will be retried twice by default.
The "raw" Response
returned by fetch()
can be accessed through the .asResponse()
method on the APIPromise
type that all methods return.
This method returns as soon as the headers for a successful response are received and does not consume the response body, so you are free to write custom parsing or streaming logic.
You can also use the .withResponse()
method to get the raw Response
along with the parsed data.
Unlike .asResponse()
this method consumes the body, returning once it is parsed.
const client = new Coingecko();
const response = await client.simple.price.get({ vs_currencies: 'usd', ids: 'bitcoin' }).asResponse();
console.log(response.headers.get('X-My-Header'));
console.log(response.statusText); // access the underlying Response object
const { data: price, response: raw } = await client.simple.price
.get({ vs_currencies: 'usd', ids: 'bitcoin' })
.withResponse();
console.log(raw.headers.get('X-My-Header'));
console.log(price);
[!IMPORTANT] All log messages are intended for debugging only. The format and content of log messages may change between releases.
The log level can be configured in two ways:
COINGECKO_LOG
environment variablelogLevel
client option (overrides the environment variable if set)import Coingecko from '@coingecko/coingecko-typescript';
const client = new Coingecko({
logLevel: 'debug', // Show all log messages
});
Available log levels, from most to least verbose:
'debug'
- Show debug messages, info, warnings, and errors'info'
- Show info messages, warnings, and errors'warn'
- Show warnings and errors (default)'error'
- Show only errors'off'
- Disable all loggingAt the 'debug'
level, all HTTP requests and responses are logged, including headers and bodies.
Some authentication-related headers are redacted, but sensitive data in request and response bodies
may still be visible.
By default, this library logs to globalThis.console
. You can also provide a custom logger.
Most logging libraries are supported, including pino, winston, bunyan, consola, signale, and @std/log. If your logger doesn't work, please open an issue.
When providing a custom logger, the logLevel
option still controls which messages are emitted, messages
below the configured level will not be sent to your logger.
import Coingecko from '@coingecko/coingecko-typescript';
import pino from 'pino';
const logger = pino();
const client = new Coingecko({
logger: logger.child({ name: 'Coingecko' }),
logLevel: 'debug', // Send all messages to pino, allowing it to filter
});
This library is typed for convenient access to the documented API. If you need to access undocumented endpoints, params, or response properties, the library can still be used.
To make requests to undocumented endpoints, you can use client.get
, client.post
, and other HTTP verbs.
Options on the client, such as retries, will be respected when making these requests.
await client.post('/some/path', {
body: { some_prop: 'foo' },
query: { some_query_arg: 'bar' },
});
To make requests using undocumented parameters, you may use // @ts-expect-error
on the undocumented
parameter. This library doesn't validate at runtime that the request matches the type, so any extra values you
send will be sent as-is.
client.simple.price.get({
// ...
// @ts-expect-error baz is not yet public
baz: 'undocumented option',
});
For requests with the GET
verb, any extra params will be in the query, all other requests will send the
extra param in the body.
If you want to explicitly send an extra argument, you can do so with the query
, body
, and headers
request
options.
To access undocumented response properties, you may access the response object with // @ts-expect-error
on
the response object, or cast the response object to the requisite type. Like the request params, we do not
validate or strip extra properties from the response from the API.
By default, this library expects a global fetch
function is defined.
If you want to use a different fetch
function, you can either polyfill the global:
import fetch from 'my-fetch';
globalThis.fetch = fetch;
Or pass it to the client:
import Coingecko from '@coingecko/coingecko-typescript';
import fetch from 'my-fetch';
const client = new Coingecko({ fetch });
If you want to set custom fetch
options without overriding the fetch
function, you can provide a fetchOptions
object when instantiating the client or making a request. (Request-specific options override client options.)
import Coingecko from '@coingecko/coingecko-typescript';
const client = new Coingecko({
fetchOptions: {
// `RequestInit` options
},
});
To modify proxy behavior, you can provide custom fetchOptions
that add runtime-specific proxy
options to requests:
Node [docs]
import Coingecko from '@coingecko/coingecko-typescript';
import * as undici from 'undici';
const proxyAgent = new undici.ProxyAgent('http://localhost:8888');
const client = new Coingecko({
fetchOptions: {
dispatcher: proxyAgent,
},
});
Bun [docs]
import Coingecko from '@coingecko/coingecko-typescript';
const client = new Coingecko({
fetchOptions: {
proxy: 'http://localhost:8888',
},
});
Deno [docs]
import Coingecko from 'npm:@coingecko/coingecko-typescript';
const httpClient = Deno.createHttpClient({ proxy: { url: 'http://localhost:8888' } });
const client = new Coingecko({
fetchOptions: {
client: httpClient,
},
});
This package generally follows SemVer conventions, though certain backwards-incompatible changes may be released as minor versions:
We take backwards-compatibility seriously and work hard to ensure you can rely on a smooth upgrade experience.
We are keen for your feedback; please open an issue with questions, bugs, or suggestions.
TypeScript >= 4.9 is supported.
The following runtimes are supported:
"node"
environment ("jsdom"
is not supported at this time).Note that React Native is not supported at this time.
If you are interested in other runtime environments, please open or upvote an issue on GitHub.
Please log in to share your review and rating for this MCP.
Discover more MCP servers with similar functionality and use cases
by stripe
Enables popular agent frameworks to integrate with Stripe APIs via function calling, providing tools for MCP, Python, and TypeScript.
by goat-sdk
GOAT is the largest agentic finance toolkit for AI agents, enabling them to become economic actors by leveraging blockchains, cryptocurrencies, and wallets.
by financial-datasets
Provides AI assistants with tools to retrieve income statements, balance sheets, cash flow statements, stock prices, market news, and crypto information via the Model Context Protocol.
by razorpay
Enables seamless interaction with Razorpay APIs via Model Context Protocol, allowing developers and AI agents to capture payments, manage orders, process refunds, handle settlements, and more through a unified MCP interface.
by armorwallet
Armor Crypto MCP provides a unified interface for AI agents to interact with the crypto ecosystem, including wallet management, swaps, staking, and multi-chain operations.
by alpacahq
Alpaca’s MCP server lets you trade stocks and options, analyze market data, and build strategies through Alpaca's Trading API.
by XeroAPI
Provides a bridge between the Model Context Protocol and Xero's API, enabling standardized access to Xero accounting and business features.
by kukapay
Integrates the Freqtrade cryptocurrency trading bot with an MCP server, exposing the bot's REST API as tools that AI agents can call for fully automated trading operations.
by kukapay
Offers over 50 cryptocurrency technical analysis indicators and corresponding trading strategies, enabling AI agents and developers to assess market trends and generate buy, hold, or sell signals.