|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export const API_REGISTRY = {
|
|
|
|
|
|
|
|
|
|
|
|
market: {
|
|
|
coingecko: {
|
|
|
name: 'CoinGecko',
|
|
|
url: 'https://api.coingecko.com/api/v3',
|
|
|
auth: { type: 'none' },
|
|
|
endpoints: {
|
|
|
prices: '/simple/price?ids={ids}&vs_currencies=usd,eur,gbp',
|
|
|
markets: '/coins/markets?vs_currency=usd&per_page=250&order=market_cap_desc',
|
|
|
trending: '/search/trending',
|
|
|
chart: '/coins/{id}/market_chart?vs_currency=usd&days={days}',
|
|
|
global: '/global'
|
|
|
},
|
|
|
rateLimit: '10-50 calls/min',
|
|
|
priority: 1
|
|
|
},
|
|
|
binance: {
|
|
|
name: 'Binance',
|
|
|
url: 'https://api.binance.com/api/v3',
|
|
|
auth: { type: 'none' },
|
|
|
endpoints: {
|
|
|
ticker24h: '/ticker/24hr?symbol={symbol}',
|
|
|
price: '/ticker/price?symbol={symbol}',
|
|
|
klines: '/klines?symbol={symbol}&interval={interval}&limit=1000',
|
|
|
exchangeInfo: '/exchangeInfo'
|
|
|
},
|
|
|
rateLimit: '1200 requests per minute',
|
|
|
priority: 1
|
|
|
},
|
|
|
coinmarketcap: {
|
|
|
name: 'CoinMarketCap',
|
|
|
url: 'https://pro-api.coinmarketcap.com/v1',
|
|
|
auth: { type: 'api_key', param_name: 'X-CMC_PRO_API_KEY' },
|
|
|
key: '04cf4b5b-9868-465c-8ba0-9f2e78c92eb1',
|
|
|
endpoints: {
|
|
|
latest: '/cryptocurrency/quotes/latest?symbol={symbol}&convert=USD',
|
|
|
listings: '/cryptocurrency/listings/latest?limit=100&convert=USD',
|
|
|
map: '/cryptocurrency/map'
|
|
|
},
|
|
|
rateLimit: '333 calls/day (free)',
|
|
|
priority: 2
|
|
|
},
|
|
|
cryptoCompare: {
|
|
|
name: 'CryptoCompare',
|
|
|
url: 'https://min-api.cryptocompare.com/data',
|
|
|
auth: { type: 'none' },
|
|
|
endpoints: {
|
|
|
price: '/pricemulti?fsyms={symbols}&tsyms=USD,EUR',
|
|
|
historical: '/histoday?fsym={from}&tsym={to}&limit=2000',
|
|
|
mining: '/mining/equipment'
|
|
|
},
|
|
|
rateLimit: '200 req/min',
|
|
|
priority: 2
|
|
|
},
|
|
|
coinpaprika: {
|
|
|
name: 'CoinPaprika',
|
|
|
url: 'https://api.coinpaprika.com/v1',
|
|
|
auth: { type: 'none' },
|
|
|
endpoints: {
|
|
|
tickers: '/tickers',
|
|
|
coins: '/coins',
|
|
|
coin: '/coins/{id}',
|
|
|
markets: '/coins/{id}/markets'
|
|
|
},
|
|
|
rateLimit: 'Unlimited',
|
|
|
priority: 2
|
|
|
},
|
|
|
coincap: {
|
|
|
name: 'CoinCap',
|
|
|
url: 'https://api.coincap.io/v2',
|
|
|
auth: { type: 'none' },
|
|
|
endpoints: {
|
|
|
assets: '/assets?limit=2000',
|
|
|
asset: '/assets/{id}',
|
|
|
history: '/assets/{id}/history?interval=d1&limit=365',
|
|
|
markets: '/markets?exchangeId={id}&limit=2000'
|
|
|
},
|
|
|
rateLimit: 'Unlimited',
|
|
|
priority: 1
|
|
|
}
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
explorers: {
|
|
|
etherscan: {
|
|
|
name: 'Etherscan',
|
|
|
url: 'https://api.etherscan.io/api',
|
|
|
auth: { type: 'api_key', param_name: 'apikey' },
|
|
|
key: 'SZHYFZK2RR8H9TIMJBVW54V4H81K2Z2KR2',
|
|
|
chain: 'ethereum',
|
|
|
endpoints: {
|
|
|
balance: '?module=account&action=balance&address={address}',
|
|
|
transactions: '?module=account&action=txlist&address={address}',
|
|
|
gasPrice: '?module=gastracker&action=gasoracle',
|
|
|
tokenInfo: '?module=token&action=tokeninfo&contractaddress={contract}'
|
|
|
},
|
|
|
rateLimit: '5 calls/sec',
|
|
|
priority: 1
|
|
|
},
|
|
|
bscscan: {
|
|
|
name: 'BscScan',
|
|
|
url: 'https://api.bscscan.com/api',
|
|
|
auth: { type: 'api_key', param_name: 'apikey' },
|
|
|
key: 'K62RKHGXTDCG53RU4MCG6XABIMJKTN19IT',
|
|
|
chain: 'bsc',
|
|
|
endpoints: {
|
|
|
balance: '?module=account&action=balance&address={address}',
|
|
|
tokenBalance: '?module=account&action=tokenbalance&address={address}'
|
|
|
},
|
|
|
priority: 1
|
|
|
},
|
|
|
polygonscan: {
|
|
|
name: 'PolygonScan',
|
|
|
url: 'https://api.polygonscan.com/api',
|
|
|
auth: { type: 'api_key', param_name: 'apikey' },
|
|
|
chain: 'polygon',
|
|
|
endpoints: {
|
|
|
balance: '?module=account&action=balance&address={address}'
|
|
|
},
|
|
|
priority: 1
|
|
|
},
|
|
|
trongrid: {
|
|
|
name: 'TronGrid',
|
|
|
url: 'https://api.trongrid.io',
|
|
|
auth: { type: 'none' },
|
|
|
chain: 'tron',
|
|
|
endpoints: {
|
|
|
account: '/wallet/getaccount',
|
|
|
balance: '/wallet/getbalance',
|
|
|
transactions: '/wallet/gettransactioncount'
|
|
|
},
|
|
|
priority: 1
|
|
|
},
|
|
|
ethplorer: {
|
|
|
name: 'Ethplorer',
|
|
|
url: 'https://api.ethplorer.io',
|
|
|
auth: { type: 'api_key', param_name: 'apiKey', key: 'freekey' },
|
|
|
chain: 'ethereum',
|
|
|
endpoints: {
|
|
|
address: '/getAddressInfo/{address}?apiKey=freekey',
|
|
|
token: '/getTokenInfo/{token}?apiKey=freekey',
|
|
|
tokenHistory: '/getTokenHistory/{token}?apiKey=freekey'
|
|
|
},
|
|
|
priority: 2
|
|
|
}
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
news: {
|
|
|
cryptopanic: {
|
|
|
name: 'CryptoPanic',
|
|
|
url: 'https://cryptopanic.com/api/v1',
|
|
|
auth: { type: 'none' },
|
|
|
endpoints: {
|
|
|
posts: '/posts/?auth_token={token}',
|
|
|
currency: '/posts/?currencies={symbol}&auth_token={token}'
|
|
|
},
|
|
|
priority: 1
|
|
|
},
|
|
|
newsapi: {
|
|
|
name: 'NewsAPI',
|
|
|
url: 'https://newsapi.org/v2',
|
|
|
auth: { type: 'api_key', param_name: 'apiKey' },
|
|
|
key: 'pub_346789abc123def456789ghi012345jkl',
|
|
|
endpoints: {
|
|
|
everything: '/everything?q={query}&sortBy=publishedAt&apiKey={key}',
|
|
|
headlines: '/top-headlines?category=business&apiKey={key}'
|
|
|
},
|
|
|
priority: 1
|
|
|
},
|
|
|
cryptocontrol: {
|
|
|
name: 'CryptoControl',
|
|
|
url: 'https://cryptocontrol.io/api/v1/public',
|
|
|
auth: { type: 'none' },
|
|
|
endpoints: {
|
|
|
local: '/news/local?language=EN',
|
|
|
latest: '/news?latest=true'
|
|
|
},
|
|
|
priority: 2
|
|
|
},
|
|
|
coindesk: {
|
|
|
name: 'CoinDesk RSS',
|
|
|
url: 'https://www.coindesk.com/arc/outboundfeeds/rss/',
|
|
|
auth: { type: 'none' },
|
|
|
type: 'rss',
|
|
|
priority: 2
|
|
|
}
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sentiment: {
|
|
|
fearAndGreed: {
|
|
|
name: 'Fear & Greed Index',
|
|
|
url: 'https://api.alternative.me/fng/',
|
|
|
auth: { type: 'none' },
|
|
|
endpoints: {
|
|
|
latest: '?limit=1',
|
|
|
history: '?limit=30',
|
|
|
date: '?date={date}&date_format=world'
|
|
|
},
|
|
|
priority: 1
|
|
|
},
|
|
|
lunarcrush: {
|
|
|
name: 'LunarCrush',
|
|
|
url: 'https://api.lunarcrush.com/v2',
|
|
|
auth: { type: 'api_key', param_name: 'key' },
|
|
|
endpoints: {
|
|
|
assets: '?data=assets&key={key}',
|
|
|
market: '?data=market&key={key}',
|
|
|
influencers: '?data=influencers&key={key}'
|
|
|
},
|
|
|
priority: 1
|
|
|
},
|
|
|
santiment: {
|
|
|
name: 'Santiment',
|
|
|
url: 'https://api.santiment.net/graphql',
|
|
|
auth: { type: 'graphql' },
|
|
|
endpoints: {
|
|
|
sentiment: 'query sentiment'
|
|
|
},
|
|
|
priority: 2
|
|
|
},
|
|
|
cryptoquant: {
|
|
|
name: 'CryptoQuant',
|
|
|
url: 'https://api.cryptoquant.com/v1',
|
|
|
auth: { type: 'api_key' },
|
|
|
endpoints: {
|
|
|
onchain: '/on-chain/all/transactions'
|
|
|
},
|
|
|
priority: 2
|
|
|
}
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
aiModels: {
|
|
|
sentiment: [
|
|
|
{
|
|
|
id: 'crypto_bert',
|
|
|
name: 'CryptoBERT',
|
|
|
url: 'kk08/CryptoBERT',
|
|
|
task: 'sentiment',
|
|
|
language: 'cryptocurrency'
|
|
|
},
|
|
|
{
|
|
|
id: 'finbert',
|
|
|
name: 'FinBERT',
|
|
|
url: 'ProsusAI/finbert',
|
|
|
task: 'sentiment',
|
|
|
language: 'financial'
|
|
|
},
|
|
|
{
|
|
|
id: 'twitter_roberta',
|
|
|
name: 'Twitter RoBERTa',
|
|
|
url: 'cardiffnlp/twitter-roberta-base-sentiment-latest',
|
|
|
task: 'sentiment',
|
|
|
language: 'social'
|
|
|
},
|
|
|
{
|
|
|
id: 'fintwitbert',
|
|
|
name: 'FinTwitBERT',
|
|
|
url: 'StephanAkkerman/FinTwitBERT-sentiment',
|
|
|
task: 'sentiment',
|
|
|
language: 'financial-social'
|
|
|
}
|
|
|
],
|
|
|
trading: [
|
|
|
{
|
|
|
id: 'crypto_trader_lm',
|
|
|
name: 'CryptoTrader LM',
|
|
|
url: 'agarkovv/CryptoTrader-LM',
|
|
|
task: 'trading-signals'
|
|
|
}
|
|
|
],
|
|
|
summarization: [
|
|
|
{
|
|
|
id: 'crypto_news_summarizer',
|
|
|
name: 'Crypto News Summarizer',
|
|
|
url: 'FurkanGozukara/Crypto-Financial-News-Summarizer',
|
|
|
task: 'summarization'
|
|
|
}
|
|
|
],
|
|
|
generation: [
|
|
|
{
|
|
|
id: 'crypto_gpt',
|
|
|
name: 'Crypto GPT O3 Mini',
|
|
|
url: 'OpenC/crypto-gpt-o3-mini',
|
|
|
task: 'text-generation'
|
|
|
}
|
|
|
]
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
whaleTracking: {
|
|
|
whaleAlert: {
|
|
|
name: 'Whale Alert',
|
|
|
url: 'https://api.whale-alert.io/v1',
|
|
|
auth: { type: 'api_key', param_name: 'api_key' },
|
|
|
endpoints: {
|
|
|
transactions: '/transactions?api_key={key}&min_value=1000000',
|
|
|
transactionsByTime: '/transactions?api_key={key}&start={timestamp}'
|
|
|
},
|
|
|
priority: 1
|
|
|
},
|
|
|
nansen: {
|
|
|
name: 'Nansen',
|
|
|
url: 'https://api.nansen.ai/v1',
|
|
|
auth: { type: 'api_key' },
|
|
|
endpoints: {
|
|
|
smartMoney: '/smart-money',
|
|
|
whaleWatching: '/whale-watching'
|
|
|
},
|
|
|
priority: 2
|
|
|
}
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
onchain: {
|
|
|
glassnode: {
|
|
|
name: 'Glassnode',
|
|
|
url: 'https://api.glassnode.com/v1',
|
|
|
auth: { type: 'api_key', param_name: 'api_key' },
|
|
|
endpoints: {
|
|
|
addresses: '/metrics/addresses/active_count',
|
|
|
transactions: '/metrics/transactions/count',
|
|
|
volume: '/metrics/spot_trading_volume'
|
|
|
},
|
|
|
priority: 1
|
|
|
},
|
|
|
covalent: {
|
|
|
name: 'Covalent',
|
|
|
url: 'https://api.covalenthq.com/v1',
|
|
|
auth: { type: 'api_key', param_name: 'key' },
|
|
|
endpoints: {
|
|
|
balances: '/{chainId}/address/{address}/balances_v2/?key={key}',
|
|
|
tokenHolders: '/{chainId}/tokens/{address}/token_holders/?key={key}',
|
|
|
transactions: '/{chainId}/address/{address}/transactions_v2/?key={key}'
|
|
|
},
|
|
|
priority: 1
|
|
|
},
|
|
|
theGraph: {
|
|
|
name: 'The Graph',
|
|
|
url: 'https://api.thegraph.com/subgraphs',
|
|
|
auth: { type: 'none' },
|
|
|
endpoints: {
|
|
|
uniswap: '/graphql?query={uniswap-query}'
|
|
|
},
|
|
|
priority: 2
|
|
|
},
|
|
|
bitquery: {
|
|
|
name: 'Bitquery',
|
|
|
url: 'https://graphql.bitquery.io',
|
|
|
auth: { type: 'graphql' },
|
|
|
endpoints: {
|
|
|
trades: 'query trades'
|
|
|
},
|
|
|
priority: 2
|
|
|
}
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
defi: {
|
|
|
uniswap: {
|
|
|
name: 'Uniswap',
|
|
|
url: 'https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3',
|
|
|
type: 'subgraph'
|
|
|
},
|
|
|
aave: {
|
|
|
name: 'Aave',
|
|
|
url: 'https://api.thegraph.com/subgraphs/name/aave/protocol-v2',
|
|
|
type: 'subgraph'
|
|
|
},
|
|
|
curve: {
|
|
|
name: 'Curve',
|
|
|
url: 'https://api.curve.fi/api/pools'
|
|
|
},
|
|
|
yearn: {
|
|
|
name: 'Yearn',
|
|
|
url: 'https://ydaemon.yearn.fi/1/vaults'
|
|
|
}
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rpc: {
|
|
|
ethereum: [
|
|
|
{
|
|
|
name: 'Infura',
|
|
|
url: 'https://mainnet.infura.io/v3/{PROJECT_ID}',
|
|
|
priority: 1
|
|
|
},
|
|
|
{
|
|
|
name: 'Alchemy',
|
|
|
url: 'https://eth-mainnet.g.alchemy.com/v2/{API_KEY}',
|
|
|
priority: 1
|
|
|
},
|
|
|
{
|
|
|
name: 'Ankr',
|
|
|
url: 'https://rpc.ankr.com/eth',
|
|
|
priority: 2
|
|
|
},
|
|
|
{
|
|
|
name: 'PublicNode',
|
|
|
url: 'https://ethereum.publicnode.com',
|
|
|
priority: 2
|
|
|
},
|
|
|
{
|
|
|
name: 'Cloudflare',
|
|
|
url: 'https://cloudflare-eth.com',
|
|
|
priority: 3
|
|
|
}
|
|
|
],
|
|
|
bsc: [
|
|
|
{
|
|
|
name: 'BSC Official',
|
|
|
url: 'https://bsc-dataseed.binance.org',
|
|
|
priority: 1
|
|
|
},
|
|
|
{
|
|
|
name: 'Ankr',
|
|
|
url: 'https://rpc.ankr.com/bsc',
|
|
|
priority: 1
|
|
|
},
|
|
|
{
|
|
|
name: 'PublicNode',
|
|
|
url: 'https://bsc-rpc.publicnode.com',
|
|
|
priority: 2
|
|
|
}
|
|
|
],
|
|
|
polygon: [
|
|
|
{
|
|
|
name: 'Polygon Official',
|
|
|
url: 'https://polygon-rpc.com',
|
|
|
priority: 1
|
|
|
},
|
|
|
{
|
|
|
name: 'Ankr',
|
|
|
url: 'https://rpc.ankr.com/polygon',
|
|
|
priority: 1
|
|
|
},
|
|
|
{
|
|
|
name: 'PublicNode',
|
|
|
url: 'https://polygon-bor-rpc.publicnode.com',
|
|
|
priority: 2
|
|
|
}
|
|
|
],
|
|
|
tron: [
|
|
|
{
|
|
|
name: 'TronGrid',
|
|
|
url: 'https://api.trongrid.io',
|
|
|
priority: 1
|
|
|
},
|
|
|
{
|
|
|
name: 'TronStack',
|
|
|
url: 'https://api.tronstack.io',
|
|
|
priority: 2
|
|
|
}
|
|
|
]
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
corsProxies: [
|
|
|
{
|
|
|
name: 'cors-anywhere',
|
|
|
url: 'https://cors-anywhere.herokuapp.com/',
|
|
|
limit: 'Unlimited',
|
|
|
priority: 1
|
|
|
},
|
|
|
{
|
|
|
name: 'allorigins',
|
|
|
url: 'https://api.allorigins.win/get?url=',
|
|
|
limit: 'No limit',
|
|
|
priority: 1
|
|
|
},
|
|
|
{
|
|
|
name: 'corsfix',
|
|
|
url: 'https://corsfix.xyz/?url=',
|
|
|
limit: '60 req/min',
|
|
|
priority: 2
|
|
|
}
|
|
|
]
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export const DATA_SOURCE_CATEGORIES = [
|
|
|
{
|
|
|
name: 'Market Data',
|
|
|
count: 6,
|
|
|
sources: ['CoinGecko', 'Binance', 'CoinMarketCap', 'CryptoCompare', 'CoinPaprika', 'CoinCap']
|
|
|
},
|
|
|
{
|
|
|
name: 'Blockchain Explorers',
|
|
|
count: 5,
|
|
|
sources: ['Etherscan', 'BscScan', 'PolygonScan', 'TronGrid', 'Ethplorer']
|
|
|
},
|
|
|
{
|
|
|
name: 'News & Media',
|
|
|
count: 4,
|
|
|
sources: ['CryptoPanic', 'NewsAPI', 'CryptoControl', 'CoinDesk RSS']
|
|
|
},
|
|
|
{
|
|
|
name: 'Sentiment Analysis',
|
|
|
count: 4,
|
|
|
sources: ['Fear & Greed', 'LunarCrush', 'Santiment', 'CryptoQuant']
|
|
|
},
|
|
|
{
|
|
|
name: 'AI/ML Models',
|
|
|
count: 10,
|
|
|
sources: ['CryptoBERT', 'FinBERT', 'Twitter RoBERTa', 'HuggingFace']
|
|
|
},
|
|
|
{
|
|
|
name: 'On-Chain Analytics',
|
|
|
count: 4,
|
|
|
sources: ['Glassnode', 'Covalent', 'The Graph', 'Bitquery']
|
|
|
},
|
|
|
{
|
|
|
name: 'Whale Tracking',
|
|
|
count: 2,
|
|
|
sources: ['Whale Alert', 'Nansen']
|
|
|
},
|
|
|
{
|
|
|
name: 'DeFi Protocols',
|
|
|
count: 4,
|
|
|
sources: ['Uniswap', 'Aave', 'Curve', 'Yearn']
|
|
|
},
|
|
|
{
|
|
|
name: 'RPC Nodes',
|
|
|
count: 20,
|
|
|
sources: ['Infura', 'Alchemy', 'Ankr', 'PublicNode', 'Cloudflare']
|
|
|
}
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function getTotalEndpointsCount() {
|
|
|
let count = 0;
|
|
|
|
|
|
|
|
|
for (const provider of Object.values(API_REGISTRY.market)) {
|
|
|
if (provider.endpoints) count += Object.keys(provider.endpoints).length;
|
|
|
}
|
|
|
for (const provider of Object.values(API_REGISTRY.explorers)) {
|
|
|
if (provider.endpoints) count += Object.keys(provider.endpoints).length;
|
|
|
}
|
|
|
for (const provider of Object.values(API_REGISTRY.news)) {
|
|
|
if (provider.endpoints) count += Object.keys(provider.endpoints).length;
|
|
|
}
|
|
|
for (const provider of Object.values(API_REGISTRY.sentiment)) {
|
|
|
if (provider.endpoints) count += Object.keys(provider.endpoints).length;
|
|
|
}
|
|
|
|
|
|
return count;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function getProvider(category, providerName) {
|
|
|
const cat = API_REGISTRY[category];
|
|
|
if (!cat) return null;
|
|
|
return cat[providerName] || null;
|
|
|
}
|
|
|
|
|
|
export default API_REGISTRY;
|
|
|
|