Skip to main content

finance_query/adapters/polygon/
benzinga.rs

1//! Benzinga partner data: analyst ratings, insights, bull/bear, consensus, guidance, earnings, news.
2
3use serde::{Deserialize, Serialize};
4
5use crate::error::Result;
6
7use super::build_client;
8use super::models::PaginatedResponse;
9
10/// Analyst rating.
11#[derive(Debug, Clone, Serialize, Deserialize)]
12#[non_exhaustive]
13pub struct AnalystRating {
14    /// Ticker symbol.
15    pub ticker: Option<String>,
16    /// Analyst name.
17    pub analyst: Option<String>,
18    /// Analyst firm.
19    pub analyst_firm: Option<String>,
20    /// Rating action (e.g., `"Initiates"`, `"Upgrades"`).
21    pub action: Option<String>,
22    /// Rating (e.g., `"Buy"`, `"Hold"`).
23    pub rating: Option<String>,
24    /// Prior rating.
25    pub prior_rating: Option<String>,
26    /// Price target.
27    pub target_price: Option<f64>,
28    /// Prior price target.
29    pub prior_target_price: Option<f64>,
30    /// Date.
31    pub date: Option<String>,
32    /// URL.
33    pub url: Option<String>,
34}
35
36/// Analyst insight.
37#[derive(Debug, Clone, Serialize, Deserialize)]
38#[non_exhaustive]
39pub struct AnalystInsight {
40    /// Ticker.
41    pub ticker: Option<String>,
42    /// Analyst.
43    pub analyst: Option<String>,
44    /// Firm.
45    pub analyst_firm: Option<String>,
46    /// Insight type.
47    pub insight_type: Option<String>,
48    /// Rating.
49    pub rating: Option<String>,
50    /// Rationale.
51    pub rationale: Option<String>,
52    /// Target price.
53    pub target_price: Option<f64>,
54    /// Date.
55    pub date: Option<String>,
56}
57
58/// Analyst details.
59#[derive(Debug, Clone, Serialize, Deserialize)]
60#[non_exhaustive]
61pub struct AnalystDetail {
62    /// Analyst name.
63    pub analyst_name: Option<String>,
64    /// Firm name.
65    pub firm_name: Option<String>,
66    /// Analyst ID.
67    pub analyst_id: Option<String>,
68    /// Firm ID.
69    pub firm_id: Option<String>,
70    /// Number of ratings.
71    pub ratings_count: Option<u32>,
72}
73
74/// Bull/bear summary.
75#[derive(Debug, Clone, Serialize, Deserialize)]
76#[non_exhaustive]
77pub struct BullBear {
78    /// Ticker.
79    pub ticker: Option<String>,
80    /// Bull case.
81    pub bull_case: Option<String>,
82    /// Bear case.
83    pub bear_case: Option<String>,
84    /// Date.
85    pub date: Option<String>,
86}
87
88/// Consensus rating.
89#[derive(Debug, Clone, Serialize, Deserialize)]
90#[non_exhaustive]
91pub struct ConsensusRating {
92    /// Ticker.
93    pub ticker: Option<String>,
94    /// Buy count.
95    pub buy: Option<u32>,
96    /// Hold count.
97    pub hold: Option<u32>,
98    /// Sell count.
99    pub sell: Option<u32>,
100    /// Strong buy count.
101    pub strong_buy: Option<u32>,
102    /// Strong sell count.
103    pub strong_sell: Option<u32>,
104    /// Consensus target price.
105    pub target_price: Option<f64>,
106    /// Target high.
107    pub target_high: Option<f64>,
108    /// Target low.
109    pub target_low: Option<f64>,
110}
111
112/// Corporate guidance.
113#[derive(Debug, Clone, Serialize, Deserialize)]
114#[non_exhaustive]
115pub struct CorporateGuidance {
116    /// Ticker.
117    pub ticker: Option<String>,
118    /// EPS guidance.
119    pub eps_guidance: Option<f64>,
120    /// Revenue guidance.
121    pub revenue_guidance: Option<f64>,
122    /// Period.
123    pub period: Option<String>,
124    /// Date.
125    pub date: Option<String>,
126}
127
128/// Earnings announcement.
129#[derive(Debug, Clone, Serialize, Deserialize)]
130#[non_exhaustive]
131pub struct EarningsAnnouncement {
132    /// Ticker.
133    pub ticker: Option<String>,
134    /// Company name.
135    pub name: Option<String>,
136    /// Report date.
137    pub date: Option<String>,
138    /// Reporting quarter.
139    pub quarter: Option<String>,
140    /// Actual EPS.
141    pub eps_actual: Option<f64>,
142    /// Estimated EPS.
143    pub eps_estimate: Option<f64>,
144    /// Actual revenue.
145    pub revenue_actual: Option<f64>,
146    /// Estimated revenue.
147    pub revenue_estimate: Option<f64>,
148}
149
150/// Firm details.
151#[derive(Debug, Clone, Serialize, Deserialize)]
152#[non_exhaustive]
153pub struct FirmDetail {
154    /// Firm name.
155    pub name: Option<String>,
156    /// Firm ID.
157    pub id: Option<String>,
158    /// Number of analysts.
159    pub analysts_count: Option<u32>,
160}
161
162/// Fetch analyst ratings.
163pub async fn analyst_ratings(params: &[(&str, &str)]) -> Result<PaginatedResponse<AnalystRating>> {
164    let client = build_client()?;
165    client
166        .get("/v2/reference/news/benzinga/analyst-ratings", params)
167        .await
168}
169
170/// Fetch analyst insights.
171pub async fn analyst_insights(
172    params: &[(&str, &str)],
173) -> Result<PaginatedResponse<AnalystInsight>> {
174    let client = build_client()?;
175    client
176        .get("/v2/reference/news/benzinga/analyst-insights", params)
177        .await
178}
179
180/// Fetch analyst details.
181pub async fn analyst_details(params: &[(&str, &str)]) -> Result<PaginatedResponse<AnalystDetail>> {
182    let client = build_client()?;
183    client
184        .get("/v2/reference/news/benzinga/analyst-details", params)
185        .await
186}
187
188/// Fetch bull/bear summaries.
189pub async fn bulls_bears(params: &[(&str, &str)]) -> Result<PaginatedResponse<BullBear>> {
190    let client = build_client()?;
191    client
192        .get("/v2/reference/news/benzinga/bulls-bears-say", params)
193        .await
194}
195
196/// Fetch consensus ratings.
197pub async fn consensus_ratings(
198    params: &[(&str, &str)],
199) -> Result<PaginatedResponse<ConsensusRating>> {
200    let client = build_client()?;
201    client
202        .get("/v2/reference/news/benzinga/consensus-ratings", params)
203        .await
204}
205
206/// Fetch corporate guidance.
207pub async fn corporate_guidance(
208    params: &[(&str, &str)],
209) -> Result<PaginatedResponse<CorporateGuidance>> {
210    let client = build_client()?;
211    client
212        .get("/v2/reference/news/benzinga/corporate-guidance", params)
213        .await
214}
215
216/// Fetch earnings announcements.
217pub async fn benzinga_earnings(
218    params: &[(&str, &str)],
219) -> Result<PaginatedResponse<EarningsAnnouncement>> {
220    let client = build_client()?;
221    client
222        .get("/v2/reference/news/benzinga/earnings", params)
223        .await
224}
225
226/// Fetch firm details.
227pub async fn firm_details(params: &[(&str, &str)]) -> Result<PaginatedResponse<FirmDetail>> {
228    let client = build_client()?;
229    client
230        .get("/v2/reference/news/benzinga/firm-details", params)
231        .await
232}