Skip to main content

Crate tvdata_rs

Crate tvdata_rs 

Source
Expand description

§tvdata-rs

tvdata-rs is a modern async Rust library for working with TradingView’s unofficial data surfaces.

It combines:

  • high-level facades for equities, crypto, and FX
  • low-level screener access for custom TradingView queries
  • typed models for quotes, fundamentals, analyst data, calendars, and history
  • capability-aware validation against live scanner metainfo

§Installation

[dependencies]
tvdata-rs = "0.1.0"
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }

§Start Here

Use these entry points as a rule of thumb:

  • client.equity() for quotes, fundamentals, analyst data, and stock overviews
  • client.crypto() and client.forex() for market snapshots and movers
  • client.history(...) or client.download_history(...) for OHLCV series
  • client.search_response(...) for rich symbol lookup metadata
  • client.economic_calendar(...), earnings_calendar(...), dividend_calendar(...), and ipo_calendar(...) for calendar products
  • client.scan(...) when you need exact TradingView screener fields and filters
  • client.metainfo(...), validate_scan_query(...), and scan_supported(...) when you want safer scanner workflows

§Quick Start

use tvdata_rs::{Result, TradingViewClient};

#[tokio::main]
async fn main() -> Result<()> {
    let client = TradingViewClient::builder().build()?;

    let quote = client.equity().quote("NASDAQ:AAPL").await?;
    println!(
        "{} close: {:?}",
        quote.instrument.ticker.as_str(),
        quote.close
    );

    Ok(())
}

§Low-Level Scanner

use tvdata_rs::prelude::*;

#[tokio::main]
async fn main() -> Result<()> {
    let client = TradingViewClient::builder().build()?;

    let query = ScanQuery::new()
        .market("america")
        .tickers(["NASDAQ:AAPL"])
        .select([
            fields::core::NAME,
            fields::price::CLOSE,
            fields::technical::RSI,
        ]);

    let response = client.scan(&query).await?;
    let record = response.rows[0].as_record(&query.columns);

    println!("{record:#?}");
    Ok(())
}

§Capability-Aware Scans

use tvdata_rs::prelude::*;

#[tokio::main]
async fn main() -> Result<()> {
    let client = TradingViewClient::builder().build()?;
    let query = ScanQuery::new()
        .market("america")
        .select([fields::core::NAME, fields::price::CLOSE]);

    let report = client.validate_scan_query(&query).await?;
    assert!(report.is_strictly_supported());

    let response = client.scan_validated(&query).await?;
    println!("rows: {}", response.rows.len());
    Ok(())
}

§Search, Calendars, And History

use tvdata_rs::{
    CalendarWindowRequest, EconomicCalendarRequest, HistoryRequest, Interval, Result,
    TradingViewClient,
};

#[tokio::main]
async fn main() -> Result<()> {
    let client = TradingViewClient::builder().build()?;

    let search = client.search_equities_response("AAPL").await?;
    println!("remaining: {}", search.symbols_remaining);

    let events = client
        .economic_calendar(&EconomicCalendarRequest::upcoming(7))
        .await?;
    println!("macro events: {}", events.events.len());

    let earnings = client
        .earnings_calendar(&CalendarWindowRequest::upcoming("america", 7))
        .await?;
    println!("earnings events: {}", earnings.len());

    let history = client
        .history(&HistoryRequest::new("NASDAQ:AAPL", Interval::Day1, 30))
        .await?;
    println!("bars: {}", history.bars.len());

    Ok(())
}

§Configuration

TradingViewClient::builder() supports:

  • retry configuration
  • endpoint overrides
  • auth-aware sessionid cookies for HTTP and websocket requests

§Caveat

TradingView does not provide a public end-user data API for this use case. This crate works against unofficial, reverse-engineered surfaces, so field support and payload shapes can change over time.

Re-exports§

pub use calendar::CalendarWindowRequest;
pub use calendar::DividendCalendarEntry;
pub use calendar::DividendCalendarRequest;
pub use calendar::DividendDateKind;
pub use calendar::EarningsCalendarEntry;
pub use calendar::IpoCalendarEntry;
pub use client::Endpoints;
pub use client::RetryConfig;
pub use client::RetryJitter;
pub use client::TradingViewClient;
pub use crypto::CryptoClient;
pub use crypto::CryptoOverview;
pub use economics::EconomicCalendarRequest;
pub use economics::EconomicCalendarResponse;
pub use economics::EconomicEvent;
pub use economics::EconomicValue;
pub use equity::AnalystForecasts;
pub use equity::AnalystFxRates;
pub use equity::AnalystPriceTargets;
pub use equity::AnalystRecommendations;
pub use equity::AnalystSummary;
pub use equity::EarningsCalendar;
pub use equity::EarningsMetrics;
pub use equity::EquityClient;
pub use equity::EquityOverview;
pub use equity::EstimateHistory;
pub use equity::EstimateMetrics;
pub use equity::EstimateObservation;
pub use equity::FundamentalMetrics;
pub use equity::FundamentalObservation;
pub use equity::FundamentalsSnapshot;
pub use equity::PointInTimeFundamentals;
pub use error::Error;
pub use error::Result;
pub use forex::ForexClient;
pub use forex::ForexOverview;
pub use history::Adjustment;
pub use history::Bar;
pub use history::HistoryBatchRequest;
pub use history::HistoryRequest;
pub use history::HistorySeries;
pub use history::Interval;
pub use history::TradingSession;
pub use metadata::DataLineage;
pub use metadata::DataSourceKind;
pub use metadata::HistoryKind;
pub use scanner::PartiallySupportedColumn;
pub use scanner::ScanValidationReport;
pub use scanner::ScannerFieldMetainfo;
pub use scanner::ScannerFieldType;
pub use scanner::ScannerMetainfo;
pub use search::SearchAssetClass;
pub use search::SearchHit;
pub use search::SearchRequest;
pub use search::SearchResponse;
pub use time_series::FiscalPeriod;
pub use time_series::HistoricalObservation;

Modules§

calendar
client
crypto
economics
equity
error
forex
history
metadata
prelude
scanner
search
time_series

Structs§

ConversionRatesSnapshot
InstrumentIdentity
QuoteSnapshot
TechnicalSummary