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 overviewsclient.crypto()andclient.forex()for market snapshots and moversclient.history(...)orclient.download_history(...)for OHLCV seriesclient.search_response(...)for rich symbol lookup metadataclient.economic_calendar(...),earnings_calendar(...),dividend_calendar(...), andipo_calendar(...)for calendar productsclient.scan(...)when you need exact TradingView screener fields and filtersclient.metainfo(...),validate_scan_query(...), andscan_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
sessionidcookies 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;