← All @molecule/* packages · App templates
@molecule/api-crypto-prices-coinmarketcapProvider bond · crypto-prices · API (Node) · v1.0.1 · Apache-2.0
CoinMarketCap crypto-prices provider — Pro v1 API with X-CMC_PRO_API_KEY auth.
npm install @molecule/api-crypto-prices-coinmarketcapnpm · Source on GitHub · Implements @molecule/api-crypto-prices
@molecule/api-crypto-prices-coinmarketcap is a provider bond on the API (Node) side: it implements the crypto-prices core interface (@molecule/api-crypto-prices) with a concrete vendor or library behind it.
Your code calls the core; you wire this provider once at startup. Swapping vendors later is one line in that wiring, not a rewrite.
import { setProvider } from '@molecule/api-crypto-prices'
import { provider } from '@molecule/api-crypto-prices-coinmarketcap'
setProvider(provider)Works with: @molecule/api-crypto-prices, @molecule/api-secrets
Secrets: COINMARKETCAP_API_KEY
Auto-generated, AI-first package reference for the molecule.dev ecosystem. It is written to be read by coding agents as much as by people, and is generated from this package's source — edit
src/index.tsJSDoc, not this file.
CoinMarketCap crypto-prices provider for molecule.dev.
Implements the CryptoPricesProvider interface against the CoinMarketCap
Pro v1 API (https://pro-api.coinmarketcap.com/v1). Authentication is
required: set the COINMARKETCAP_API_KEY environment variable (or pass
apiKey to {@link createProvider}); the provider sends it in the
X-CMC_PRO_API_KEY header on every request.
import { setProvider } from '@molecule/api-crypto-prices'
import { provider } from '@molecule/api-crypto-prices-coinmarketcap'
setProvider(provider)
provider
npm install @molecule/api-crypto-prices-coinmarketcap @molecule/api-crypto-prices @molecule/api-secrets
CoinMarketCapCryptoPricesConfigConfiguration options for the CoinMarketCap crypto-prices provider.
The CoinMarketCap Pro API
(https://pro-api.coinmarketcap.com/v1) requires authentication, so
{@link apiKey} (or the COINMARKETCAP_API_KEY environment variable) must
be provided before any request is made. The key is sent in the
X-CMC_PRO_API_KEY header.
interface CoinMarketCapCryptoPricesConfig {
/**
* Base URL override. Defaults to `'https://pro-api.coinmarketcap.com/v1'`.
*/
baseUrl?: string
/**
* CoinMarketCap Pro API key. Sent in the `X-CMC_PRO_API_KEY` header on
* every request. The provider does not include the key in any error
* messages.
*/
apiKey?: string
/**
* Request timeout in milliseconds. Defaults to `10000`.
*/
timeout?: number
}
CoinMarketCapRateLimitedErrorError thrown by the CoinMarketCap provider when the upstream API rejects a request with HTTP 429 (Too Many Requests).
The error never includes the configured API key (or any other secret) in its message or properties.
createProvider(config)Creates a CoinMarketCap crypto-prices provider.
function createProvider(config?: CoinMarketCapCryptoPricesConfig): CryptoPricesProvider
config — Provider configuration. {@link CoinMarketCapCryptoPricesConfig.apiKey} (or COINMARKETCAP_API_KEY in process.env) must be set for the upstream API to accept any request.Returns: A {@link CryptoPricesProvider} backed by the CoinMarketCap Pro v1 API.
cryptoPricesCoinmarketcapSecretDefinitionsSecret definitions required by the CoinMarketCap crypto-prices bond.
const cryptoPricesCoinmarketcapSecretDefinitions: SecretDefinition[]
providerThe provider implementation, lazily initialized on first use.
Reads COINMARKETCAP_API_KEY and COINMARKETCAP_BASE_URL from
environment variables. The CMC Pro API requires authentication, so an
API key must be configured before any request is made; otherwise the
upstream server returns 401.
const provider: CryptoPricesProvider
RATE_LIMITEDStable error code emitted by the CoinMarketCap provider when the upstream API returns HTTP 429 (Too Many Requests).
Catch on this constant rather than parsing error messages — the message text is for humans only.
const RATE_LIMITED: 'RATE_LIMITED'
Implements @molecule/api-crypto-prices interface.
Setup function to register this provider with the core interface:
import { setProvider } from '@molecule/api-crypto-prices'
import { provider } from '@molecule/api-crypto-prices-coinmarketcap'
export function setupCryptoPricesCoinmarketcap(): void {
setProvider(provider)
}
Peer dependencies:
@molecule/api-crypto-prices ^1.0.1@molecule/api-secrets ^1.0.1COINMARKETCAP_API_KEY (required) — CoinMarketCap API key
@molecule/api-crypto-prices
@molecule/api-secrets
The id round-trip holds. An id from listCoins() /
listSupportedSymbols() — CMC's NUMERIC id ('1' for BTC) — is a valid
input to getPrice() / getHistorical() / getMarketStats(), per the
core {@link CoinId} contract. Those methods dispatch on the id shape: a
purely-numeric id is sent as CoinMarketCap's id= query parameter,
anything else as symbol= — so passing a ticker symbol ('BTC') works
too.
The bond does not fail fast on a missing key: without
COINMARKETCAP_API_KEY the auth header is simply omitted and every call
surfaces CoinMarketCap's raw HTTP 401. COINMARKETCAP_BASE_URL (optional)
overrides the Pro v1 endpoint.
HTTP 429 raises CoinMarketCapRateLimitedError (code RATE_LIMITED,
retryAfterSeconds parsed from Retry-After) — catch on the code, not
the message.
Integration checklist — drive the real UI (live preview, no mocks), adapt each item to this app's actual screens/flows, and check every box off one by one. A box you can't check is an integration bug to fix — not a skip:
getPrice(id, 'usd') (id
from listCoins()/listSupportedSymbols(), never a hardcoded provider id)
returns a CoinPriceQuote with a PLAUSIBLE price (BTC is thousands of
USD, not 0/null/NaN) and it shows on screen, not "—".listCoins() renders multiple
CoinMarketRows and each coin's price is its own value (BTC ≠ ETH, not a
repeated copy), with symbol/name matching the row.getHistorical(id, days) returns a
series of CoinPricePoint (ts, price) samples in chronological order that
render as a line/spark chart — not a single point or an empty box.vsCurrency and the displayed values CHANGE, shown with the right symbol
and precision ($/€, not a raw float).getPrice/listCoins can return a different
price/change24h and the UI updates (or shows an "as of" time from
asOf) — it isn't frozen at first paint.