Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Market Data

The Market Data API provides comprehensive access to real-time and historical market information for Solana tokens. This includes trending tokens, price feeds, token analysis, market statistics, and search functionality.

Overview

The MarketDataClient offers a complete suite of market data operations:

  • Trending Tokens: Get tokens trending across different timeframes
  • Token Information: Detailed token metadata and analysis
  • Price Feeds: Real-time and historical price data
  • Market Statistics: Overall market metrics and trends
  • Token Search: Find tokens by name, symbol, or address
  • Chart Data: OHLCV candle data for technical analysis

Quick Start

use axiomtrade_rs::api::market_data::MarketDataClient;
use axiomtrade_rs::models::market::TimePeriod;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut client = MarketDataClient::new()?;
    
    // Get trending tokens
    let trending = client.get_trending_tokens(TimePeriod::TwentyFourHours).await?;
    
    println!("Top trending token: {} - {}", 
        trending[0].symbol, 
        trending[0].name
    );
    
    Ok(())
}

Get tokens that are currently trending based on volume, price movement, and trading activity.

#![allow(unused)]
fn main() {
use axiomtrade_rs::models::market::TimePeriod;

// Get 24-hour trending tokens
let trending = client.get_trending_tokens(TimePeriod::TwentyFourHours).await?;

for (i, token) in trending.iter().take(10).enumerate() {
    println!("{}. {} ({}) - ${:.8}", 
        i + 1,
        token.symbol,
        token.name,
        token.price_usd
    );
    println!("   Change: {:.2}% | Volume: ${:.2}", 
        token.price_change_24h,
        token.volume_24h
    );
}
}

Time Periods

#![allow(unused)]
fn main() {
// Available time periods
TimePeriod::OneHour        // 1h trending
TimePeriod::TwentyFourHours // 24h trending  
TimePeriod::SevenDays      // 7d trending
TimePeriod::ThirtyDays     // 30d trending
}
#![allow(unused)]
fn main() {
pub struct TrendingToken {
    pub mint_address: String,      // Token mint address
    pub symbol: String,            // Token symbol (e.g., "BONK")
    pub name: String,              // Full token name
    pub price_usd: f64,           // Current price in USD
    pub price_change_24h: f64,    // 24h price change percentage
    pub price_change_7d: f64,     // 7d price change percentage  
    pub volume_24h: f64,          // 24h trading volume
    pub market_cap: f64,          // Market capitalization
    pub holders: u64,             // Number of token holders
    pub rank: u32,                // Trending rank
    pub logo_uri: Option<String>, // Token logo URL
}
}

Token Information

Get detailed information about specific tokens including metadata, liquidity, and protocol details.

Get Token Info by Symbol

#![allow(unused)]
fn main() {
// Get detailed token information
let token_info = client.get_token_info("BONK").await?;

println!("Token: {} ({})", token_info.name, token_info.symbol);
println!("Decimals: {}", token_info.decimals);
println!("Supply: {:.2}", token_info.supply);
println!("Liquidity SOL: {:.2}", token_info.liquidity_sol);
println!("Protocol: {}", token_info.protocol);
}

Get Token Info by Address

#![allow(unused)]
fn main() {
// Get token info using mint or pair address
let address = "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"; // Example BONK mint
let token_info = client.get_token_info_by_address(address).await?;

println!("Found token: {} at address {}", 
    token_info.symbol, 
    token_info.mint_address
);
}

Token Information Data Structure

#![allow(unused)]
fn main() {
pub struct TokenInfo {
    pub mint_address: String,         // Token mint address
    pub symbol: String,               // Token symbol
    pub name: String,                 // Token name
    pub decimals: u8,                // Token decimals
    pub supply: f64,                 // Total supply
    pub liquidity_sol: f64,          // SOL liquidity
    pub liquidity_token: f64,        // Token liquidity
    pub pair_address: String,        // Pair contract address
    pub protocol: String,            // DEX protocol (Raydium, etc.)
    pub protocol_details: Option<Value>, // Additional protocol data
    pub created_at: String,          // Creation timestamp
    pub logo_uri: Option<String>,    // Token logo URL
    pub mint_authority: Option<String>, // Mint authority
    pub freeze_authority: Option<String>, // Freeze authority
    pub lp_burned: f64,              // LP tokens burned percentage
}
}

Token Analysis

Get creator analysis and risk assessment for tokens.

Get Token Analysis

#![allow(unused)]
fn main() {
// Get creator analysis and related tokens
let analysis = client.get_token_analysis("BONK").await?;

println!("Creator Risk Level: {}", analysis.creator_risk_level);
println!("Creator Rug Count: {}", analysis.creator_rug_count);
println!("Creator Token Count: {}", analysis.creator_token_count);

// Show related tokens from same creator
println!("Related high market cap tokens:");
for token in &analysis.top_market_cap_coins {
    println!("  {} - ${:.2} market cap", 
        token.symbol, 
        token.market_cap
    );
}
}

Token Analysis Data Structure

#![allow(unused)]
fn main() {
pub struct TokenAnalysis {
    pub creator_risk_level: String,           // Risk assessment
    pub creator_rug_count: u32,              // Number of rugs by creator
    pub creator_token_count: u32,            // Total tokens by creator
    pub top_market_cap_coins: Vec<RelatedToken>, // High cap related tokens
    pub top_og_coins: Vec<RelatedToken>,     // Original related tokens
}

pub struct RelatedToken {
    pub mint_address: String,        // Token mint address
    pub symbol: String,              // Token symbol
    pub name: String,                // Token name
    pub pair_address: String,        // Pair address
    pub market_cap: f64,            // Market capitalization
    pub created_at: String,         // Creation date
    pub last_trade_time: String,    // Last trade timestamp
    pub image: Option<String>,      // Token image URL
    pub migrated: bool,             // Migration status
    pub bonding_curve_percent: f64, // Bonding curve completion
}
}

Price Feeds

Get current and historical price data for tokens.

Current Price

#![allow(unused)]
fn main() {
// Get current price for a token
let mint = "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263";
let price = client.get_token_price(mint).await?;

println!("Current price: ${:.8} USD", price.price_usd);
println!("Price in SOL: {:.6}", price.price_sol);
println!("Last updated: {}", price.timestamp);
}

Historical Price Feed

#![allow(unused)]
fn main() {
// Get historical price data
let price_feed = client.get_price_feed(mint, TimePeriod::TwentyFourHours).await?;

println!("Price history for {}:", price_feed.mint_address);
for point in price_feed.prices.iter().take(10) {
    println!("  ${:.8} at {} (Volume: ${:.2})", 
        point.price_usd,
        point.timestamp,
        point.volume
    );
}
}

Batch Prices

#![allow(unused)]
fn main() {
// Get prices for multiple tokens at once
let mints = vec![
    "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263".to_string(), // BONK
    "So11111111111111111111111111111111111111112".to_string(),      // SOL
];

let prices = client.get_batch_prices(&mints).await?;

for price in prices {
    println!("{}: ${:.6}", price.mint_address, price.price_usd);
}
}

Price Data Structures

#![allow(unused)]
fn main() {
pub struct PriceData {
    pub mint_address: String,    // Token mint address
    pub price_usd: f64,         // Price in USD
    pub price_sol: f64,         // Price in SOL
    pub timestamp: i64,         // Unix timestamp
}

pub struct PriceFeed {
    pub mint_address: String,       // Token mint address
    pub prices: Vec<PricePoint>,   // Historical price points
}

pub struct PricePoint {
    pub timestamp: i64,    // Unix timestamp
    pub price_usd: f64,   // Price in USD
    pub price_sol: f64,   // Price in SOL
    pub volume: f64,      // Trading volume
}
}

Chart Data

Get OHLCV candle data for technical analysis and charting.

Get Token Chart

#![allow(unused)]
fn main() {
use axiomtrade_rs::models::market::ChartTimeframe;

// Get 1-hour candles for a token
let chart = client.get_token_chart(
    mint,
    ChartTimeframe::OneHour,
    Some(100) // Limit to 100 candles
).await?;

println!("Chart data for {} ({})", chart.mint_address, chart.timeframe);

for candle in chart.candles.iter().take(10) {
    println!("  O: {:.6} H: {:.6} L: {:.6} C: {:.6} V: {:.2}",
        candle.open,
        candle.high,
        candle.low,
        candle.close,
        candle.volume
    );
}
}

Chart Timeframes

#![allow(unused)]
fn main() {
ChartTimeframe::OneMinute      // 1m candles
ChartTimeframe::FiveMinutes    // 5m candles
ChartTimeframe::FifteenMinutes // 15m candles
ChartTimeframe::OneHour        // 1h candles
ChartTimeframe::FourHours      // 4h candles
ChartTimeframe::OneDay         // 1d candles
ChartTimeframe::OneWeek        // 1w candles
}

Chart Data Structures

#![allow(unused)]
fn main() {
pub struct TokenChart {
    pub mint_address: String,         // Token mint address
    pub timeframe: ChartTimeframe,    // Chart timeframe
    pub candles: Vec<Candle>,        // OHLCV candles
}

pub struct Candle {
    pub timestamp: i64,    // Candle timestamp
    pub open: f64,        // Opening price
    pub high: f64,        // Highest price
    pub low: f64,         // Lowest price
    pub close: f64,       // Closing price
    pub volume: f64,      // Trading volume
}
}

Market Statistics

Get overall market metrics and trends.

Get Market Stats

#![allow(unused)]
fn main() {
// Get overall market statistics
let stats = client.get_market_stats().await?;

println!("Market Statistics:");
println!("  Total 24h Volume: ${:.2}", stats.total_volume_24h);
println!("  Total Market Cap: ${:.2}", stats.total_market_cap);
println!("  Active Traders: {}", stats.active_traders_24h);
println!("  Total Transactions: {}", stats.total_transactions_24h);
println!("  Trending Tokens: {}", stats.trending_tokens_count);
println!("  New Tokens (24h): {}", stats.new_tokens_24h);
}

Market Statistics Data Structure

#![allow(unused)]
fn main() {
pub struct MarketStats {
    pub total_volume_24h: f64,         // Total 24h trading volume
    pub total_market_cap: f64,         // Total market capitalization
    pub active_traders_24h: u64,       // Active traders in 24h
    pub total_transactions_24h: u64,   // Total transactions in 24h
    pub trending_tokens_count: u32,    // Number of trending tokens
    pub new_tokens_24h: u32,          // New tokens launched in 24h
}
}

Search for tokens by name, symbol, or partial matches.

Search Tokens

#![allow(unused)]
fn main() {
// Search for tokens
let results = client.search_tokens("bonk", Some(10)).await?;

println!("Search results for 'bonk':");
for (i, token) in results.results.iter().enumerate() {
    println!("{}. {} ({}) - ${:.8}", 
        i + 1,
        token.symbol,
        token.name,
        token.market_cap
    );
    
    if let Some(website) = &token.website {
        println!("   Website: {}", website);
    }
    
    if let Some(twitter) = &token.twitter {
        println!("   Twitter: {}", twitter);
    }
}
}

Search Data Structures

#![allow(unused)]
fn main() {
pub struct TokenSearch {
    pub query: String,                      // Original search query
    pub results: Vec<TokenSearchResult>,   // Search results
}

pub struct TokenSearchResult {
    pub mint_address: String,        // Token mint address
    pub symbol: String,              // Token symbol
    pub name: String,                // Token name
    pub logo_uri: Option<String>,    // Token logo URL
    pub decimals: u8,               // Token decimals
    pub supply: f64,                // Total supply
    pub liquidity_sol: f64,         // SOL liquidity
    pub market_cap: f64,            // Market capitalization
    pub volume_sol: f64,            // SOL volume
    pub created_at: String,         // Creation timestamp
    pub pair_address: String,       // Pair address
    pub protocol: String,           // DEX protocol
    pub website: Option<String>,    // Project website
    pub twitter: Option<String>,    // Twitter handle
    pub telegram: Option<String>,   // Telegram channel
}
}

Error Handling

The Market Data API uses comprehensive error handling for robust applications.

Error Types

#![allow(unused)]
fn main() {
use axiomtrade_rs::api::market_data::MarketDataError;

match client.get_trending_tokens(TimePeriod::TwentyFourHours).await {
    Ok(tokens) => {
        println!("Found {} trending tokens", tokens.len());
    }
    Err(MarketDataError::AuthError(_)) => {
        println!("Authentication failed - check credentials");
    }
    Err(MarketDataError::TokenNotFound(symbol)) => {
        println!("Token not found: {}", symbol);
    }
    Err(MarketDataError::InvalidTokenMint(mint)) => {
        println!("Invalid mint address: {}", mint);
    }
    Err(MarketDataError::NetworkError(_)) => {
        println!("Network error - check connection");
    }
    Err(MarketDataError::ApiError(msg)) => {
        println!("API error: {}", msg);
    }
    Err(e) => {
        println!("Unexpected error: {}", e);
    }
}
}

Complete Example

Here's a comprehensive example showing various market data operations:

use axiomtrade_rs::api::market_data::MarketDataClient;
use axiomtrade_rs::models::market::{TimePeriod, ChartTimeframe};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Initialize client
    let mut client = MarketDataClient::new()?;
    
    // Get trending tokens
    println!("=== TRENDING TOKENS ===");
    let trending = client.get_trending_tokens(TimePeriod::TwentyFourHours).await?;
    
    for (i, token) in trending.iter().take(5).enumerate() {
        println!("{}. {} - ${:.8} ({:.2}%)", 
            i + 1,
            token.symbol,
            token.price_usd,
            token.price_change_24h
        );
    }
    
    // Get detailed info for top token
    if let Some(top_token) = trending.first() {
        println!("\n=== TOKEN DETAILS ===");
        let token_info = client.get_token_info(&top_token.symbol).await?;
        
        println!("Name: {}", token_info.name);
        println!("Symbol: {}", token_info.symbol);
        println!("Supply: {:.2}", token_info.supply);
        println!("Liquidity: {:.2} SOL", token_info.liquidity_sol);
        
        // Get price history
        println!("\n=== PRICE HISTORY ===");
        let price_feed = client.get_price_feed(
            &token_info.mint_address, 
            TimePeriod::TwentyFourHours
        ).await?;
        
        println!("Last 5 price points:");
        for point in price_feed.prices.iter().rev().take(5) {
            println!("  ${:.8} (Volume: {:.2})", 
                point.price_usd, 
                point.volume
            );
        }
        
        // Get chart data
        println!("\n=== CHART DATA ===");
        let chart = client.get_token_chart(
            &token_info.mint_address,
            ChartTimeframe::OneHour,
            Some(5)
        ).await?;
        
        println!("Recent candles:");
        for candle in &chart.candles {
            println!("  OHLC: {:.6}/{:.6}/{:.6}/{:.6}", 
                candle.open, 
                candle.high, 
                candle.low, 
                candle.close
            );
        }
    }
    
    // Get market statistics
    println!("\n=== MARKET STATS ===");
    let stats = client.get_market_stats().await?;
    println!("Total Volume: ${:.2}", stats.total_volume_24h);
    println!("Active Traders: {}", stats.active_traders_24h);
    
    // Search for tokens
    println!("\n=== TOKEN SEARCH ===");
    let search_results = client.search_tokens("sol", Some(3)).await?;
    
    for result in &search_results.results {
        println!("{} ({}) - ${:.2} market cap", 
            result.symbol,
            result.name,
            result.market_cap
        );
    }
    
    Ok(())
}

Best Practices

Rate Limiting

The API includes built-in rate limiting. For high-frequency applications:

#![allow(unused)]
fn main() {
use tokio::time::{sleep, Duration};

// Add delays between requests for bulk operations
for symbol in token_symbols {
    let info = client.get_token_info(&symbol).await?;
    // Process info...
    
    sleep(Duration::from_millis(100)).await; // Prevent rate limiting
}
}

Error Recovery

Implement retry logic for network failures:

#![allow(unused)]
fn main() {
use tokio::time::{sleep, Duration};

async fn get_trending_with_retry(
    client: &mut MarketDataClient,
    period: TimePeriod,
    max_retries: u32
) -> Result<Vec<TrendingToken>, MarketDataError> {
    for attempt in 0..max_retries {
        match client.get_trending_tokens(period.clone()).await {
            Ok(tokens) => return Ok(tokens),
            Err(MarketDataError::NetworkError(_)) if attempt < max_retries - 1 => {
                sleep(Duration::from_millis(1000 * (attempt + 1) as u64)).await;
                continue;
            }
            Err(e) => return Err(e),
        }
    }
    
    unreachable!()
}
}

Batch Operations

Use batch endpoints when possible for better performance:

#![allow(unused)]
fn main() {
// Instead of multiple individual calls
// let price1 = client.get_token_price(mint1).await?;
// let price2 = client.get_token_price(mint2).await?;

// Use batch endpoint
let mints = vec![mint1.to_string(), mint2.to_string()];
let prices = client.get_batch_prices(&mints).await?;
}

Data Validation

Always validate mint addresses before API calls:

#![allow(unused)]
fn main() {
fn is_valid_mint_address(address: &str) -> bool {
    address.len() >= 32 && 
    address.len() <= 44 && 
    address.chars().all(|c| c.is_ascii_alphanumeric())
}

if is_valid_mint_address(&mint_address) {
    let price = client.get_token_price(&mint_address).await?;
} else {
    println!("Invalid mint address format");
}
}

The Market Data API provides comprehensive access to Solana token market information, enabling developers to build sophisticated trading applications, market analysis tools, and portfolio management systems.