finance_dev 0.9.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. finance_dev/__init__.py +18 -0
  2. finance_dev/_hooks/__init__.py +7 -0
  3. finance_dev/_hooks/clientcredentials.py +319 -0
  4. finance_dev/_hooks/oauth2scopes.py +50 -0
  5. finance_dev/_hooks/registration.py +13 -0
  6. finance_dev/_hooks/sdkhooks.py +82 -0
  7. finance_dev/_hooks/types.py +125 -0
  8. finance_dev/_version.py +16 -0
  9. finance_dev/accounts.py +797 -0
  10. finance_dev/alternativedata.py +4830 -0
  11. finance_dev/analytics.py +3757 -0
  12. finance_dev/basesdk.py +393 -0
  13. finance_dev/calendar.py +1523 -0
  14. finance_dev/chart.py +1881 -0
  15. finance_dev/company.py +1105 -0
  16. finance_dev/corporateactions.py +1795 -0
  17. finance_dev/economy.py +1153 -0
  18. finance_dev/errors/__init__.py +94 -0
  19. finance_dev/errors/apierror.py +41 -0
  20. finance_dev/errors/authenticationerrorenvelope.py +43 -0
  21. finance_dev/errors/badrequest.py +34 -0
  22. finance_dev/errors/errorenvelope.py +42 -0
  23. finance_dev/errors/errorresponse.py +45 -0
  24. finance_dev/errors/financedevapierror.py +31 -0
  25. finance_dev/errors/forbidden.py +34 -0
  26. finance_dev/errors/internalservererror.py +35 -0
  27. finance_dev/errors/no_response_error.py +18 -0
  28. finance_dev/errors/notfound.py +34 -0
  29. finance_dev/errors/orderhistorybadrequest.py +35 -0
  30. finance_dev/errors/predorderserrorenvelope.py +42 -0
  31. finance_dev/errors/responsevalidationerror.py +28 -0
  32. finance_dev/errors/unauthorized.py +34 -0
  33. finance_dev/estimates.py +1906 -0
  34. finance_dev/etf.py +1108 -0
  35. finance_dev/filings.py +586 -0
  36. finance_dev/financials.py +4079 -0
  37. finance_dev/history.py +477 -0
  38. finance_dev/httpclient.py +126 -0
  39. finance_dev/indices.py +2308 -0
  40. finance_dev/logos.py +692 -0
  41. finance_dev/market.py +1825 -0
  42. finance_dev/markets.py +952 -0
  43. finance_dev/models/__init__.py +4568 -0
  44. finance_dev/models/accountbalancev2.py +340 -0
  45. finance_dev/models/accountitem.py +78 -0
  46. finance_dev/models/accountposition.py +147 -0
  47. finance_dev/models/aggregatetechnicalindicatorsresponse.py +192 -0
  48. finance_dev/models/analystinsightitem.py +161 -0
  49. finance_dev/models/analystinsightsresponse.py +39 -0
  50. finance_dev/models/apperror.py +123 -0
  51. finance_dev/models/authenticationerrordetail.py +58 -0
  52. finance_dev/models/bankbranchesresponse.py +96 -0
  53. finance_dev/models/basicfinancials.py +243 -0
  54. finance_dev/models/bullbearanalysisresponse.py +150 -0
  55. finance_dev/models/cancelorderop.py +40 -0
  56. finance_dev/models/cancelordrequest_union.py +287 -0
  57. finance_dev/models/cancelordresponse.py +115 -0
  58. finance_dev/models/cashflowstatement.py +290 -0
  59. finance_dev/models/cashflowstatementsresponse.py +61 -0
  60. finance_dev/models/chartbars.py +111 -0
  61. finance_dev/models/chartconfig.py +81 -0
  62. finance_dev/models/chartresolution.py +46 -0
  63. finance_dev/models/companyesgresponse.py +408 -0
  64. finance_dev/models/companyexecutive.py +70 -0
  65. finance_dev/models/companyexecutiveresponse.py +39 -0
  66. finance_dev/models/companypeersresponse.py +38 -0
  67. finance_dev/models/companypresentationresponse.py +96 -0
  68. finance_dev/models/companyprofile.py +255 -0
  69. finance_dev/models/conferencecallsresponse.py +169 -0
  70. finance_dev/models/congressionaltradingresponse.py +138 -0
  71. finance_dev/models/covid19uscasesresponse.py +79 -0
  72. finance_dev/models/createconfigwatchlistop.py +40 -0
  73. finance_dev/models/createwatchlistrequest.py +43 -0
  74. finance_dev/models/dailymarketsummaryresponse.py +73 -0
  75. finance_dev/models/deleteconfigwatchlistbyidop.py +53 -0
  76. finance_dev/models/dividenditem.py +125 -0
  77. finance_dev/models/dividendsresponse.py +61 -0
  78. finance_dev/models/earningrelease.py +291 -0
  79. finance_dev/models/earningscallliveresponse.py +103 -0
  80. finance_dev/models/earningsqualityscoreresponse.py +140 -0
  81. finance_dev/models/earningssurprisesresponse.py +125 -0
  82. finance_dev/models/ebitdaestimatesresponse.py +176 -0
  83. finance_dev/models/ebitestimatesresponse.py +176 -0
  84. finance_dev/models/economicscalendarevent.py +160 -0
  85. finance_dev/models/economicsindicator.py +87 -0
  86. finance_dev/models/epsestimatesresponse.py +176 -0
  87. finance_dev/models/equitydetailsdto.py +569 -0
  88. finance_dev/models/errorcode.py +48 -0
  89. finance_dev/models/etblistresponse.py +43 -0
  90. finance_dev/models/etbsearchrequest.py +21 -0
  91. finance_dev/models/etbsearchresponse.py +43 -0
  92. finance_dev/models/etfcountryallocationresponse.py +113 -0
  93. finance_dev/models/etfholdingsresponse.py +163 -0
  94. finance_dev/models/etfprofileresponse.py +234 -0
  95. finance_dev/models/etfsectorallocationresponse.py +113 -0
  96. finance_dev/models/exchangecode.py +90 -0
  97. finance_dev/models/fdaadvisorycommitteecalendarresponse.py +88 -0
  98. finance_dev/models/filingsimilarityrecord.py +115 -0
  99. finance_dev/models/filingssimilarityindexdatawrapper.py +52 -0
  100. finance_dev/models/filingssimilarityindexresponse.py +42 -0
  101. finance_dev/models/financialratiosresponse.py +252 -0
  102. finance_dev/models/financialsreporteddatawrapper.py +49 -0
  103. finance_dev/models/financialsreportedresponse.py +42 -0
  104. finance_dev/models/financialsrevenuebreakdowndatawrapper.py +49 -0
  105. finance_dev/models/financialsrevenuebreakdownresponse.py +42 -0
  106. finance_dev/models/financialsstatementsdatawrapper.py +44 -0
  107. finance_dev/models/financialsstatementsresponse.py +42 -0
  108. finance_dev/models/financialstatement.py +171 -0
  109. finance_dev/models/financialstatementtype.py +14 -0
  110. finance_dev/models/getaccountbalanceop.py +53 -0
  111. finance_dev/models/getaccountpositionsop.py +53 -0
  112. finance_dev/models/getaccountsresponse.py +22 -0
  113. finance_dev/models/getaggregatetechnicalindicatorsop.py +94 -0
  114. finance_dev/models/getanalystinsightsop.py +164 -0
  115. finance_dev/models/getbankbranchesop.py +53 -0
  116. finance_dev/models/getbaseeventop.py +87 -0
  117. finance_dev/models/getbullbearanalysisop.py +91 -0
  118. finance_dev/models/getcashflowstatementsop.py +564 -0
  119. finance_dev/models/getchartconfigop.py +40 -0
  120. finance_dev/models/getcharthistoryop.py +122 -0
  121. finance_dev/models/getcharttimeop.py +39 -0
  122. finance_dev/models/getcompanyesgop.py +53 -0
  123. finance_dev/models/getcompanyexecutivesop.py +56 -0
  124. finance_dev/models/getcompanymetricsop.py +68 -0
  125. finance_dev/models/getcompanypeersop.py +53 -0
  126. finance_dev/models/getcompanypresentationop.py +56 -0
  127. finance_dev/models/getcompanyprofileop.py +86 -0
  128. finance_dev/models/getconferencecallsop.py +111 -0
  129. finance_dev/models/getconfigwatchlistbyidop.py +53 -0
  130. finance_dev/models/getconfigwatchlistsop.py +40 -0
  131. finance_dev/models/getcongressionaltradingop.py +73 -0
  132. finance_dev/models/getcovid19uscasesop.py +43 -0
  133. finance_dev/models/getdailymarketsummaryop.py +92 -0
  134. finance_dev/models/getdividendsop.py +294 -0
  135. finance_dev/models/getearningscalendarop.py +87 -0
  136. finance_dev/models/getearningscallliveop.py +91 -0
  137. finance_dev/models/getearningsqualityscoreop.py +81 -0
  138. finance_dev/models/getearningssurprisesop.py +80 -0
  139. finance_dev/models/getebitdaestimatesop.py +91 -0
  140. finance_dev/models/getebitestimatesop.py +88 -0
  141. finance_dev/models/geteconomicscalendarop.py +92 -0
  142. finance_dev/models/geteconomicscalendarresponse.py +56 -0
  143. finance_dev/models/getepsestimatesop.py +88 -0
  144. finance_dev/models/getequitydetailsop.py +56 -0
  145. finance_dev/models/getequitydetailsresponse.py +45 -0
  146. finance_dev/models/getetblistop.py +40 -0
  147. finance_dev/models/getetfcountryallocationop.py +80 -0
  148. finance_dev/models/getetfholdingsop.py +96 -0
  149. finance_dev/models/getetfprofileop.py +77 -0
  150. finance_dev/models/getetfsectorallocationop.py +80 -0
  151. finance_dev/models/geteventcontractsop.py +87 -0
  152. finance_dev/models/getfdaadvisorycommitteecalendarop.py +47 -0
  153. finance_dev/models/getfilingssimilarityindexop.py +102 -0
  154. finance_dev/models/getfinancialratiosop.py +612 -0
  155. finance_dev/models/getfinancialstatementsop.py +117 -0
  156. finance_dev/models/getfundownershipop.py +77 -0
  157. finance_dev/models/gethistoricaldataop.py +61 -0
  158. finance_dev/models/gethistoricalesgop.py +53 -0
  159. finance_dev/models/gethistorybatchop.py +74 -0
  160. finance_dev/models/gethistoryop.py +123 -0
  161. finance_dev/models/getincomestatementsop.py +564 -0
  162. finance_dev/models/getindexbarop.py +140 -0
  163. finance_dev/models/getindexbarsop.py +149 -0
  164. finance_dev/models/getindexchartbarsop.py +178 -0
  165. finance_dev/models/getindexrealtimevaluesop.py +94 -0
  166. finance_dev/models/getinflationexpectationsop.py +157 -0
  167. finance_dev/models/getinflationop.py +154 -0
  168. finance_dev/models/getinsidertransactionsop.py +90 -0
  169. finance_dev/models/getinstitutionalownershipop.py +99 -0
  170. finance_dev/models/getinstitutionalportfolioop.py +75 -0
  171. finance_dev/models/getinvestmentthemeop.py +68 -0
  172. finance_dev/models/getipocalendarop.py +63 -0
  173. finance_dev/models/getlobbyingop.py +70 -0
  174. finance_dev/models/getmarketbreadthop.py +40 -0
  175. finance_dev/models/getmarketholidaysop.py +65 -0
  176. finance_dev/models/getmarketstatusop.py +65 -0
  177. finance_dev/models/getmergersandacquisitionsop.py +113 -0
  178. finance_dev/models/getnetinflowop.py +40 -0
  179. finance_dev/models/getnewsbyidop.py +73 -0
  180. finance_dev/models/getnewsop.py +98 -0
  181. finance_dev/models/getnewssentimentop.py +53 -0
  182. finance_dev/models/getoptionchainsnapshotop.py +244 -0
  183. finance_dev/models/getoptioncontractsnapshotop.py +69 -0
  184. finance_dev/models/getoptiondetailsop.py +56 -0
  185. finance_dev/models/getoptiondetailsresponse.py +45 -0
  186. finance_dev/models/getoptionlasttradeop.py +56 -0
  187. finance_dev/models/getoptionopencloseop.py +66 -0
  188. finance_dev/models/getoptionpreviousdayop.py +56 -0
  189. finance_dev/models/getoptionquotesop.py +177 -0
  190. finance_dev/models/getoptionsactivityop.py +111 -0
  191. finance_dev/models/getoptionsetfstopvolumeop.py +70 -0
  192. finance_dev/models/getoptionsstockstopgainersop.py +70 -0
  193. finance_dev/models/getoptionsstockstopvolumeop.py +70 -0
  194. finance_dev/models/getoptionsunusualactivityop.py +100 -0
  195. finance_dev/models/getoptiontradesop.py +177 -0
  196. finance_dev/models/getordersv2response.py +66 -0
  197. finance_dev/models/getownershipdataop.py +77 -0
  198. finance_dev/models/getpositionsresponse.py +39 -0
  199. finance_dev/models/getpredictionorderop.py +88 -0
  200. finance_dev/models/getpricetargetop.py +53 -0
  201. finance_dev/models/getquotesop.py +53 -0
  202. finance_dev/models/getratingsop.py +164 -0
  203. finance_dev/models/getratingsresponse.py +39 -0
  204. finance_dev/models/getreportedfinancialsop.py +127 -0
  205. finance_dev/models/getrevenuebreakdownop.py +85 -0
  206. finance_dev/models/getrevenueestimatesop.py +91 -0
  207. finance_dev/models/getsecfilingsop.py +113 -0
  208. finance_dev/models/getsectortickersop.py +124 -0
  209. finance_dev/models/getsectorwisechangeop.py +84 -0
  210. finance_dev/models/getshortinterestop.py +334 -0
  211. finance_dev/models/getshortvolumeop.py +333 -0
  212. finance_dev/models/getsocialsentimentop.py +90 -0
  213. finance_dev/models/getspinoffsop.py +112 -0
  214. finance_dev/models/getstockaggregatesop.py +174 -0
  215. finance_dev/models/getstocklastquoteop.py +56 -0
  216. finance_dev/models/getstocklasttradeop.py +56 -0
  217. finance_dev/models/getstockopencloseop.py +90 -0
  218. finance_dev/models/getstockpreviousdayop.py +80 -0
  219. finance_dev/models/getstockquotesop.py +177 -0
  220. finance_dev/models/getstocksnapshotsop.py +82 -0
  221. finance_dev/models/getstocksplitsop.py +243 -0
  222. finance_dev/models/getstocktradesop.py +177 -0
  223. finance_dev/models/getsupplychainop.py +53 -0
  224. finance_dev/models/getsupportresistancelevelsop.py +90 -0
  225. finance_dev/models/getsymbolinfoop.py +53 -0
  226. finance_dev/models/gettechnicalindicatorop.py +172 -0
  227. finance_dev/models/gettechnicalpatternsop.py +88 -0
  228. finance_dev/models/gettenderoffersop.py +112 -0
  229. finance_dev/models/gettickhistoryop.py +104 -0
  230. finance_dev/models/gettopgainersop.py +78 -0
  231. finance_dev/models/gettoplosersop.py +78 -0
  232. finance_dev/models/gettopmostactiveop.py +78 -0
  233. finance_dev/models/gettranscriptop.py +53 -0
  234. finance_dev/models/gettreasuryyieldsop.py +157 -0
  235. finance_dev/models/getunifiedsnapshotop.py +223 -0
  236. finance_dev/models/getupgradesdowngradesop.py +91 -0
  237. finance_dev/models/getusaspendingop.py +70 -0
  238. finance_dev/models/getuseraccountsop.py +40 -0
  239. finance_dev/models/getusptopatentsop.py +70 -0
  240. finance_dev/models/getvisaapplicationsop.py +73 -0
  241. finance_dev/models/historicalesgresponse.py +439 -0
  242. finance_dev/models/httpmetadata.py +24 -0
  243. finance_dev/models/incomestatement.py +296 -0
  244. finance_dev/models/incomestatementsresponse.py +61 -0
  245. finance_dev/models/indexbarresponse.py +194 -0
  246. finance_dev/models/indexbarsresponse.py +123 -0
  247. finance_dev/models/indexchartbarsresponse.py +213 -0
  248. finance_dev/models/indexgroupsresponse.py +78 -0
  249. finance_dev/models/indexlistresponse.py +95 -0
  250. finance_dev/models/indexsearchresponse.py +93 -0
  251. finance_dev/models/indicesbygroupresponse.py +93 -0
  252. finance_dev/models/indicesidentifiertype.py +28 -0
  253. finance_dev/models/indicesrealtimeindexinfo.py +67 -0
  254. finance_dev/models/indicesrealtimeindexvalue.py +157 -0
  255. finance_dev/models/indicesrealtimevaluesitem.py +80 -0
  256. finance_dev/models/indicesrealtimevaluesresponse.py +42 -0
  257. finance_dev/models/inflationexpectationsresponse.py +140 -0
  258. finance_dev/models/inflationresponse.py +132 -0
  259. finance_dev/models/insidertransaction.py +97 -0
  260. finance_dev/models/insidertransactionsresponse.py +39 -0
  261. finance_dev/models/institutionalholding.py +77 -0
  262. finance_dev/models/institutionalownershipresponse.py +39 -0
  263. finance_dev/models/institutionalportfolioresponse.py +39 -0
  264. finance_dev/models/investmentthemeid.py +35 -0
  265. finance_dev/models/investmentthemeresponse.py +80 -0
  266. finance_dev/models/ipocalendarresponse.py +39 -0
  267. finance_dev/models/ipoitem.py +93 -0
  268. finance_dev/models/listactiveordersop.py +87 -0
  269. finance_dev/models/listcategoriesop.py +79 -0
  270. finance_dev/models/listindexgroupsop.py +40 -0
  271. finance_dev/models/listindicesbygroupop.py +58 -0
  272. finance_dev/models/listindicesop.py +91 -0
  273. finance_dev/models/listoptioncontractsop.py +66 -0
  274. finance_dev/models/listoptionexpirydatesop.py +56 -0
  275. finance_dev/models/listorderhistoryop.py +139 -0
  276. finance_dev/models/listpredictionordersop.py +134 -0
  277. finance_dev/models/listtranscriptsop.py +53 -0
  278. finance_dev/models/lobbyingresponse.py +166 -0
  279. finance_dev/models/logosearchresponse.py +152 -0
  280. finance_dev/models/logosyncresponse.py +277 -0
  281. finance_dev/models/marketbreadth.py +97 -0
  282. finance_dev/models/marketbreadthresponse.py +44 -0
  283. finance_dev/models/marketholiday.py +56 -0
  284. finance_dev/models/marketholidayresponse.py +39 -0
  285. finance_dev/models/marketstatus.py +67 -0
  286. finance_dev/models/mergersandacquisitionsresponse.py +186 -0
  287. finance_dev/models/metricseriespoint.py +43 -0
  288. finance_dev/models/netinflow.py +81 -0
  289. finance_dev/models/netinflowresponse.py +44 -0
  290. finance_dev/models/newsitem.py +102 -0
  291. finance_dev/models/newslistresponse.py +128 -0
  292. finance_dev/models/newssentimentresponse.py +176 -0
  293. finance_dev/models/newstypeenum.py +16 -0
  294. finance_dev/models/optionchainsnapshotresponse.py +64 -0
  295. finance_dev/models/optioncontractsnapshotresponse.py +64 -0
  296. finance_dev/models/optioncontractsnapshotrow.py +164 -0
  297. finance_dev/models/optioncontractsresponse.py +131 -0
  298. finance_dev/models/optiondetailsdto.py +72 -0
  299. finance_dev/models/optionexpirydatesresponse.py +53 -0
  300. finance_dev/models/optionlasttraderesponse.py +169 -0
  301. finance_dev/models/optionopencloseresponse.py +97 -0
  302. finance_dev/models/optionpreviousdayresponse.py +89 -0
  303. finance_dev/models/optionquotesresponse.py +138 -0
  304. finance_dev/models/optionsactivityresponse.py +265 -0
  305. finance_dev/models/optionsnapshotcontractdetails.py +85 -0
  306. finance_dev/models/optionsnapshotdaybar.py +107 -0
  307. finance_dev/models/optionsnapshotgreeks.py +67 -0
  308. finance_dev/models/optionsnapshotlastquote.py +116 -0
  309. finance_dev/models/optionsnapshotlasttrade.py +102 -0
  310. finance_dev/models/optionsnapshotunderlying.py +86 -0
  311. finance_dev/models/optionsscreeneritem.py +151 -0
  312. finance_dev/models/optionsunusualactivityresponse.py +62 -0
  313. finance_dev/models/optionsunusualactivitytrade.py +103 -0
  314. finance_dev/models/optiontradesresponse.py +132 -0
  315. finance_dev/models/orderrequesttimeinforceenum.py +29 -0
  316. finance_dev/models/ordersideenum.py +20 -0
  317. finance_dev/models/ordertypeenum.py +20 -0
  318. finance_dev/models/ordleg.py +162 -0
  319. finance_dev/models/ordresponse.py +202 -0
  320. finance_dev/models/ownershipdataresponse.py +39 -0
  321. finance_dev/models/ownershiprecord.py +74 -0
  322. finance_dev/models/placeorderop.py +40 -0
  323. finance_dev/models/placeordrequest_union.py +335 -0
  324. finance_dev/models/placepredictionorderop.py +114 -0
  325. finance_dev/models/predmdbaseevent.py +62 -0
  326. finance_dev/models/predmdbaseeventhit.py +53 -0
  327. finance_dev/models/predmdbaseeventsearchresult.py +46 -0
  328. finance_dev/models/predmdbaseeventwithevents.py +32 -0
  329. finance_dev/models/predmdbatchhistoryrequest.py +16 -0
  330. finance_dev/models/predmdbatchhistoryresponse.py +16 -0
  331. finance_dev/models/predmdcategory.py +48 -0
  332. finance_dev/models/predmdcontract.py +177 -0
  333. finance_dev/models/predmdcontracthit.py +157 -0
  334. finance_dev/models/predmdcontractsearchresult.py +46 -0
  335. finance_dev/models/predmdevent.py +136 -0
  336. finance_dev/models/predmdeventhit.py +73 -0
  337. finance_dev/models/predmdeventsearchresult.py +46 -0
  338. finance_dev/models/predmdeventwithcontracts.py +22 -0
  339. finance_dev/models/predmdhistoryrequest.py +59 -0
  340. finance_dev/models/predmdhistoryresponse.py +53 -0
  341. finance_dev/models/predmdtick.py +53 -0
  342. finance_dev/models/predordersapperror.py +78 -0
  343. finance_dev/models/predordersorder.py +267 -0
  344. finance_dev/models/predordersorderdetail.py +26 -0
  345. finance_dev/models/predordersorderpage.py +45 -0
  346. finance_dev/models/predordersorderreport.py +88 -0
  347. finance_dev/models/predordersplaceorderrequest.py +159 -0
  348. finance_dev/models/previeworderop.py +40 -0
  349. finance_dev/models/previeworderresponse.py +127 -0
  350. finance_dev/models/pricetargetresponse.py +89 -0
  351. finance_dev/models/quotedata.py +49 -0
  352. finance_dev/models/quotesresponse.py +62 -0
  353. finance_dev/models/quotevalues.py +114 -0
  354. finance_dev/models/rating.py +193 -0
  355. finance_dev/models/ratingsaccuracy.py +242 -0
  356. finance_dev/models/replaceconfigwatchlistsop.py +40 -0
  357. finance_dev/models/replaceorderop.py +40 -0
  358. finance_dev/models/replaceordrequest_union.py +367 -0
  359. finance_dev/models/replaceordresponse.py +144 -0
  360. finance_dev/models/reportedbsitem.py +53 -0
  361. finance_dev/models/reportedfiling.py +110 -0
  362. finance_dev/models/reportedreport.py +39 -0
  363. finance_dev/models/reportingfrequency.py +16 -0
  364. finance_dev/models/revenuebreakdownaxis.py +52 -0
  365. finance_dev/models/revenuebreakdowndatapoint.py +58 -0
  366. finance_dev/models/revenuebreakdownentry.py +51 -0
  367. finance_dev/models/revenuebreakdowninner.py +75 -0
  368. finance_dev/models/revenueestimatesresponse.py +176 -0
  369. finance_dev/models/screenclause.py +70 -0
  370. finance_dev/models/screengroup.py +75 -0
  371. finance_dev/models/searchetbsymbolsop.py +40 -0
  372. finance_dev/models/searchindicesop.py +55 -0
  373. finance_dev/models/searchlogosop.py +158 -0
  374. finance_dev/models/searchmarketsymbolsop.py +80 -0
  375. finance_dev/models/searchop.py +232 -0
  376. finance_dev/models/searchsymbolitem.py +76 -0
  377. finance_dev/models/searchsymbolresponseitem.py +71 -0
  378. finance_dev/models/searchsymbolsop.py +77 -0
  379. finance_dev/models/secfiling.py +91 -0
  380. finance_dev/models/secfilingsresponse.py +39 -0
  381. finance_dev/models/sectoravgchange.py +50 -0
  382. finance_dev/models/security.py +59 -0
  383. finance_dev/models/securitytypeenum.py +16 -0
  384. finance_dev/models/shortinterestresponse.py +126 -0
  385. finance_dev/models/shortvolumeresponse.py +198 -0
  386. finance_dev/models/socialsentimentresponse.py +124 -0
  387. finance_dev/models/sortorderenum.py +13 -0
  388. finance_dev/models/spinoffsresponse.py +136 -0
  389. finance_dev/models/stockaggregatesresponse.py +92 -0
  390. finance_dev/models/stocklastquoteresponse.py +175 -0
  391. finance_dev/models/stocklasttraderesponse.py +169 -0
  392. finance_dev/models/stockohlcbar.py +85 -0
  393. finance_dev/models/stockopencloseresponse.py +109 -0
  394. finance_dev/models/stockpreviousdayresponse.py +86 -0
  395. finance_dev/models/stockquotesresponse.py +170 -0
  396. finance_dev/models/stockscreenerop.py +144 -0
  397. finance_dev/models/stockscreenerrequest.py +131 -0
  398. finance_dev/models/stockscreenerresponse.py +197 -0
  399. finance_dev/models/stocksnapshotsresponse.py +454 -0
  400. finance_dev/models/stocksplitsresponse.py +144 -0
  401. finance_dev/models/stocktradesresponse.py +164 -0
  402. finance_dev/models/supplychainresponse.py +158 -0
  403. finance_dev/models/supportresistancelevelsresponse.py +68 -0
  404. finance_dev/models/symboldetails.py +119 -0
  405. finance_dev/models/symbolerror.py +43 -0
  406. finance_dev/models/symbolinfo.py +183 -0
  407. finance_dev/models/synclogosop.py +146 -0
  408. finance_dev/models/technicalindicatorresponse.py +43 -0
  409. finance_dev/models/technicalindicatortype.py +21 -0
  410. finance_dev/models/technicalpatternsresponse.py +249 -0
  411. finance_dev/models/tenderofferidentifiertype.py +26 -0
  412. finance_dev/models/tenderoffersresponse.py +548 -0
  413. finance_dev/models/tickchartbars.py +104 -0
  414. finance_dev/models/tickresolution.py +20 -0
  415. finance_dev/models/timeinforceenum.py +26 -0
  416. finance_dev/models/tradeorderlegv2.py +164 -0
  417. finance_dev/models/tradeorderv2.py +434 -0
  418. finance_dev/models/transcriptresponse.py +162 -0
  419. finance_dev/models/transcriptsresponse.py +89 -0
  420. finance_dev/models/treasuryyieldsresponse.py +160 -0
  421. finance_dev/models/unifiedsnapshotresponse.py +308 -0
  422. finance_dev/models/updateconfigwatchlistbyidop.py +65 -0
  423. finance_dev/models/updatewatchlistrequest_union.py +134 -0
  424. finance_dev/models/upgradesdowngradesresponse.py +98 -0
  425. finance_dev/models/usaspendingresponse.py +222 -0
  426. finance_dev/models/usptopatentsresponse.py +134 -0
  427. finance_dev/models/visaapplicationsresponse.py +228 -0
  428. finance_dev/models/watchlist.py +68 -0
  429. finance_dev/models/watchlistrequest.py +43 -0
  430. finance_dev/models/watchlistresponse.py +44 -0
  431. finance_dev/news_sdk.py +829 -0
  432. finance_dev/options.py +3443 -0
  433. finance_dev/orders.py +1907 -0
  434. finance_dev/ownership.py +1386 -0
  435. finance_dev/predictions.py +29 -0
  436. finance_dev/predictions_orders.py +852 -0
  437. finance_dev/py.typed +1 -0
  438. finance_dev/sdk.py +347 -0
  439. finance_dev/sdkconfiguration.py +50 -0
  440. finance_dev/signals.py +338 -0
  441. finance_dev/stocks.py +3131 -0
  442. finance_dev/technicalanalysis_sdk.py +1137 -0
  443. finance_dev/types/__init__.py +25 -0
  444. finance_dev/types/base64fileinput.py +44 -0
  445. finance_dev/types/basemodel.py +78 -0
  446. finance_dev/utils/__init__.py +181 -0
  447. finance_dev/utils/annotations.py +80 -0
  448. finance_dev/utils/datetimes.py +42 -0
  449. finance_dev/utils/dynamic_imports.py +55 -0
  450. finance_dev/utils/enums.py +135 -0
  451. finance_dev/utils/eventstreaming.py +327 -0
  452. finance_dev/utils/forms.py +240 -0
  453. finance_dev/utils/headers.py +137 -0
  454. finance_dev/utils/logger.py +23 -0
  455. finance_dev/utils/metadata.py +120 -0
  456. finance_dev/utils/queryparams.py +218 -0
  457. finance_dev/utils/requestbodies.py +68 -0
  458. finance_dev/utils/retries.py +373 -0
  459. finance_dev/utils/security.py +199 -0
  460. finance_dev/utils/serializers.py +327 -0
  461. finance_dev/utils/unmarshal_json_response.py +39 -0
  462. finance_dev/utils/url.py +155 -0
  463. finance_dev/utils/values.py +143 -0
  464. finance_dev/watchlist_sdk.py +1583 -0
  465. finance_dev/websocket/__init__.py +57 -0
  466. finance_dev/websocket/account.py +5 -0
  467. finance_dev/websocket/auth.py +124 -0
  468. finance_dev/websocket/chart.py +5 -0
  469. finance_dev/websocket/codec.py +66 -0
  470. finance_dev/websocket/config.py +52 -0
  471. finance_dev/websocket/errors.py +54 -0
  472. finance_dev/websocket/market.py +5 -0
  473. finance_dev/websocket/models/__init__.py +52 -0
  474. finance_dev/websocket/models/account.py +60 -0
  475. finance_dev/websocket/models/chart.py +44 -0
  476. finance_dev/websocket/models/common.py +85 -0
  477. finance_dev/websocket/models/market.py +113 -0
  478. finance_dev/websocket/resources.py +327 -0
  479. finance_dev/websocket/sdk.py +13 -0
  480. finance_dev/websocket/transport/async_connection.py +493 -0
  481. finance_dev/websocket/transport/base.py +78 -0
  482. finance_dev/websocket/transport/sync_connection.py +470 -0
  483. finance_dev-0.9.0.dist-info/METADATA +913 -0
  484. finance_dev-0.9.0.dist-info/RECORD +486 -0
  485. finance_dev-0.9.0.dist-info/WHEEL +5 -0
  486. finance_dev-0.9.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1906 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+ # @generated-id: 5dfba7f764e5
3
+
4
+ from .basesdk import BaseSDK
5
+ from datetime import date
6
+ from finance_dev import errors, models, utils
7
+ from finance_dev._hooks import HookContext
8
+ from finance_dev.types import OptionalNullable, UNSET
9
+ from finance_dev.utils.unmarshal_json_response import unmarshal_json_response
10
+ from typing import Any, Mapping, Optional
11
+
12
+
13
+ class Estimates(BaseSDK):
14
+ def get_earnings_surprises(
15
+ self,
16
+ *,
17
+ symbol: str,
18
+ limit: Optional[int] = None,
19
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
20
+ server_url: Optional[str] = None,
21
+ timeout_ms: Optional[int] = None,
22
+ http_headers: Optional[Mapping[str, str]] = None,
23
+ ) -> models.GetEarningsSurprisesResponse:
24
+ r"""Get Earnings Surprises
25
+
26
+ Retrieve historical earnings surprises comparing actual reported earnings to analyst estimates with surprise percentages.
27
+
28
+ If `limit` cannot be parsed as a signed 64-bit integer, returns 400 Bad Request with error code `INVALID_PARAMETER` and message `invalid limit parameter`.
29
+
30
+ If set, this operation will use `client_id` from the global security.
31
+
32
+ :param symbol: Stock ticker to query. Send the plain uppercase symbol exactly as you'd type it on a brokerage screen, e.g. `AAPL`, `MSFT`, `TSLA`.
33
+ :param limit: (Optional) Number of results to return
34
+ :param retries: Override the default retry configuration for this method
35
+ :param server_url: Override the default server URL for this method
36
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
37
+ :param http_headers: Additional headers to set or replace on requests.
38
+ """
39
+ base_url = None
40
+ url_variables = None
41
+ if timeout_ms is None:
42
+ timeout_ms = self.sdk_configuration.timeout_ms
43
+
44
+ if timeout_ms is None:
45
+ timeout_ms = 30000
46
+
47
+ if server_url is not None:
48
+ base_url = server_url
49
+ else:
50
+ base_url = self._get_url(base_url, url_variables)
51
+
52
+ request = models.GetEarningsSurprisesRequest(
53
+ symbol=symbol,
54
+ limit=limit,
55
+ )
56
+
57
+ req = self._build_request(
58
+ method="GET",
59
+ path="/v1/stock/earnings",
60
+ base_url=base_url,
61
+ url_variables=url_variables,
62
+ request=request,
63
+ request_body_required=False,
64
+ request_has_path_params=False,
65
+ request_has_query_params=True,
66
+ user_agent_header="user-agent",
67
+ accept_header_value="application/json",
68
+ http_headers=http_headers,
69
+ security=self.sdk_configuration.security,
70
+ allow_empty_value=None,
71
+ allowed_fields=["client_id"],
72
+ timeout_ms=timeout_ms,
73
+ )
74
+
75
+ if retries == UNSET:
76
+ if self.sdk_configuration.retry_config is not UNSET:
77
+ retries = self.sdk_configuration.retry_config
78
+ else:
79
+ retries = utils.RetryConfig(
80
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
81
+ )
82
+
83
+ retry_config = None
84
+ if isinstance(retries, utils.RetryConfig):
85
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
86
+
87
+ http_res = self.do_request(
88
+ hook_ctx=HookContext(
89
+ config=self.sdk_configuration,
90
+ base_url=base_url or "",
91
+ operation_id="getEarningsSurprises",
92
+ oauth2_scopes=["market:supplemental"],
93
+ security_source=self.sdk_configuration.security,
94
+ tags=["Stock Estimates"],
95
+ extensions=None,
96
+ ),
97
+ request=req,
98
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
99
+ retry_config=retry_config,
100
+ )
101
+
102
+ response_data: Any = None
103
+ if utils.match_response(http_res, "200", "application/json"):
104
+ return models.GetEarningsSurprisesResponse(
105
+ earnings_surprises_response=unmarshal_json_response(
106
+ Optional[models.EarningsSurprisesResponse], http_res
107
+ ),
108
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
109
+ )
110
+ if utils.match_response(http_res, "400", "application/json"):
111
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
112
+ response_data.http_meta = models.HTTPMetadata(
113
+ request=req, response=http_res
114
+ )
115
+ raise errors.BadRequest(response_data, http_res)
116
+ if utils.match_response(http_res, "401", "application/json"):
117
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
118
+ response_data.http_meta = models.HTTPMetadata(
119
+ request=req, response=http_res
120
+ )
121
+ raise errors.Unauthorized(response_data, http_res)
122
+ if utils.match_response(http_res, "403", "application/json"):
123
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
124
+ response_data.http_meta = models.HTTPMetadata(
125
+ request=req, response=http_res
126
+ )
127
+ raise errors.Forbidden(response_data, http_res)
128
+ if utils.match_response(http_res, "404", "application/json"):
129
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
130
+ response_data.http_meta = models.HTTPMetadata(
131
+ request=req, response=http_res
132
+ )
133
+ raise errors.NotFound(response_data, http_res)
134
+ if utils.match_response(http_res, "500", "application/json"):
135
+ response_data = unmarshal_json_response(
136
+ errors.InternalServerErrorUnion, http_res
137
+ )
138
+ response_data.http_meta = models.HTTPMetadata(
139
+ request=req, response=http_res
140
+ )
141
+ raise errors.InternalServerError(response_data, http_res)
142
+ if utils.match_response(http_res, "4XX", "*"):
143
+ http_res_text = utils.stream_to_text(http_res)
144
+ raise errors.APIError("API error occurred", http_res, http_res_text)
145
+ if utils.match_response(http_res, "5XX", "*"):
146
+ http_res_text = utils.stream_to_text(http_res)
147
+ raise errors.APIError("API error occurred", http_res, http_res_text)
148
+
149
+ raise errors.APIError("Unexpected response received", http_res)
150
+
151
+ async def get_earnings_surprises_async(
152
+ self,
153
+ *,
154
+ symbol: str,
155
+ limit: Optional[int] = None,
156
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
157
+ server_url: Optional[str] = None,
158
+ timeout_ms: Optional[int] = None,
159
+ http_headers: Optional[Mapping[str, str]] = None,
160
+ ) -> models.GetEarningsSurprisesResponse:
161
+ r"""Get Earnings Surprises
162
+
163
+ Retrieve historical earnings surprises comparing actual reported earnings to analyst estimates with surprise percentages.
164
+
165
+ If `limit` cannot be parsed as a signed 64-bit integer, returns 400 Bad Request with error code `INVALID_PARAMETER` and message `invalid limit parameter`.
166
+
167
+ If set, this operation will use `client_id` from the global security.
168
+
169
+ :param symbol: Stock ticker to query. Send the plain uppercase symbol exactly as you'd type it on a brokerage screen, e.g. `AAPL`, `MSFT`, `TSLA`.
170
+ :param limit: (Optional) Number of results to return
171
+ :param retries: Override the default retry configuration for this method
172
+ :param server_url: Override the default server URL for this method
173
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
174
+ :param http_headers: Additional headers to set or replace on requests.
175
+ """
176
+ base_url = None
177
+ url_variables = None
178
+ if timeout_ms is None:
179
+ timeout_ms = self.sdk_configuration.timeout_ms
180
+
181
+ if timeout_ms is None:
182
+ timeout_ms = 30000
183
+
184
+ if server_url is not None:
185
+ base_url = server_url
186
+ else:
187
+ base_url = self._get_url(base_url, url_variables)
188
+
189
+ request = models.GetEarningsSurprisesRequest(
190
+ symbol=symbol,
191
+ limit=limit,
192
+ )
193
+
194
+ req = self._build_request_async(
195
+ method="GET",
196
+ path="/v1/stock/earnings",
197
+ base_url=base_url,
198
+ url_variables=url_variables,
199
+ request=request,
200
+ request_body_required=False,
201
+ request_has_path_params=False,
202
+ request_has_query_params=True,
203
+ user_agent_header="user-agent",
204
+ accept_header_value="application/json",
205
+ http_headers=http_headers,
206
+ security=self.sdk_configuration.security,
207
+ allow_empty_value=None,
208
+ allowed_fields=["client_id"],
209
+ timeout_ms=timeout_ms,
210
+ )
211
+
212
+ if retries == UNSET:
213
+ if self.sdk_configuration.retry_config is not UNSET:
214
+ retries = self.sdk_configuration.retry_config
215
+ else:
216
+ retries = utils.RetryConfig(
217
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
218
+ )
219
+
220
+ retry_config = None
221
+ if isinstance(retries, utils.RetryConfig):
222
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
223
+
224
+ http_res = await self.do_request_async(
225
+ hook_ctx=HookContext(
226
+ config=self.sdk_configuration,
227
+ base_url=base_url or "",
228
+ operation_id="getEarningsSurprises",
229
+ oauth2_scopes=["market:supplemental"],
230
+ security_source=self.sdk_configuration.security,
231
+ tags=["Stock Estimates"],
232
+ extensions=None,
233
+ ),
234
+ request=req,
235
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
236
+ retry_config=retry_config,
237
+ )
238
+
239
+ response_data: Any = None
240
+ if utils.match_response(http_res, "200", "application/json"):
241
+ return models.GetEarningsSurprisesResponse(
242
+ earnings_surprises_response=unmarshal_json_response(
243
+ Optional[models.EarningsSurprisesResponse], http_res
244
+ ),
245
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
246
+ )
247
+ if utils.match_response(http_res, "400", "application/json"):
248
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
249
+ response_data.http_meta = models.HTTPMetadata(
250
+ request=req, response=http_res
251
+ )
252
+ raise errors.BadRequest(response_data, http_res)
253
+ if utils.match_response(http_res, "401", "application/json"):
254
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
255
+ response_data.http_meta = models.HTTPMetadata(
256
+ request=req, response=http_res
257
+ )
258
+ raise errors.Unauthorized(response_data, http_res)
259
+ if utils.match_response(http_res, "403", "application/json"):
260
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
261
+ response_data.http_meta = models.HTTPMetadata(
262
+ request=req, response=http_res
263
+ )
264
+ raise errors.Forbidden(response_data, http_res)
265
+ if utils.match_response(http_res, "404", "application/json"):
266
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
267
+ response_data.http_meta = models.HTTPMetadata(
268
+ request=req, response=http_res
269
+ )
270
+ raise errors.NotFound(response_data, http_res)
271
+ if utils.match_response(http_res, "500", "application/json"):
272
+ response_data = unmarshal_json_response(
273
+ errors.InternalServerErrorUnion, http_res
274
+ )
275
+ response_data.http_meta = models.HTTPMetadata(
276
+ request=req, response=http_res
277
+ )
278
+ raise errors.InternalServerError(response_data, http_res)
279
+ if utils.match_response(http_res, "4XX", "*"):
280
+ http_res_text = await utils.stream_to_text_async(http_res)
281
+ raise errors.APIError("API error occurred", http_res, http_res_text)
282
+ if utils.match_response(http_res, "5XX", "*"):
283
+ http_res_text = await utils.stream_to_text_async(http_res)
284
+ raise errors.APIError("API error occurred", http_res, http_res_text)
285
+
286
+ raise errors.APIError("Unexpected response received", http_res)
287
+
288
+ def get_ebit_estimates(
289
+ self,
290
+ *,
291
+ symbol: str,
292
+ freq: Optional[models.ReportingFrequency] = None,
293
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
294
+ server_url: Optional[str] = None,
295
+ timeout_ms: Optional[int] = None,
296
+ http_headers: Optional[Mapping[str, str]] = None,
297
+ ) -> models.GetEbitEstimatesResponse:
298
+ r"""Get EBIT Estimates
299
+
300
+ Retrieve analyst EBIT (Earnings Before Interest and Taxes) estimates showing projected operating profitability.
301
+
302
+ If set, this operation will use `client_id` from the global security.
303
+
304
+ :param symbol: Stock ticker to query. Send the plain uppercase symbol exactly as you'd type it on a brokerage screen, e.g. `AAPL`, `MSFT`, `TSLA`.
305
+ :param freq: (Optional) Frequency: annual, quarterly
306
+ :param retries: Override the default retry configuration for this method
307
+ :param server_url: Override the default server URL for this method
308
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
309
+ :param http_headers: Additional headers to set or replace on requests.
310
+ """
311
+ base_url = None
312
+ url_variables = None
313
+ if timeout_ms is None:
314
+ timeout_ms = self.sdk_configuration.timeout_ms
315
+
316
+ if timeout_ms is None:
317
+ timeout_ms = 30000
318
+
319
+ if server_url is not None:
320
+ base_url = server_url
321
+ else:
322
+ base_url = self._get_url(base_url, url_variables)
323
+
324
+ request = models.GetEbitEstimatesRequest(
325
+ symbol=symbol,
326
+ freq=freq,
327
+ )
328
+
329
+ req = self._build_request(
330
+ method="GET",
331
+ path="/v1/stock/ebit-estimate",
332
+ base_url=base_url,
333
+ url_variables=url_variables,
334
+ request=request,
335
+ request_body_required=False,
336
+ request_has_path_params=False,
337
+ request_has_query_params=True,
338
+ user_agent_header="user-agent",
339
+ accept_header_value="application/json",
340
+ http_headers=http_headers,
341
+ security=self.sdk_configuration.security,
342
+ allow_empty_value=None,
343
+ allowed_fields=["client_id"],
344
+ timeout_ms=timeout_ms,
345
+ )
346
+
347
+ if retries == UNSET:
348
+ if self.sdk_configuration.retry_config is not UNSET:
349
+ retries = self.sdk_configuration.retry_config
350
+ else:
351
+ retries = utils.RetryConfig(
352
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
353
+ )
354
+
355
+ retry_config = None
356
+ if isinstance(retries, utils.RetryConfig):
357
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
358
+
359
+ http_res = self.do_request(
360
+ hook_ctx=HookContext(
361
+ config=self.sdk_configuration,
362
+ base_url=base_url or "",
363
+ operation_id="getEbitEstimates",
364
+ oauth2_scopes=["market:supplemental"],
365
+ security_source=self.sdk_configuration.security,
366
+ tags=["Stock Estimates"],
367
+ extensions=None,
368
+ ),
369
+ request=req,
370
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
371
+ retry_config=retry_config,
372
+ )
373
+
374
+ response_data: Any = None
375
+ if utils.match_response(http_res, "200", "application/json"):
376
+ return models.GetEbitEstimatesResponse(
377
+ ebit_estimates_response=unmarshal_json_response(
378
+ Optional[models.EbitEstimatesResponse], http_res
379
+ ),
380
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
381
+ )
382
+ if utils.match_response(http_res, "400", "application/json"):
383
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
384
+ response_data.http_meta = models.HTTPMetadata(
385
+ request=req, response=http_res
386
+ )
387
+ raise errors.BadRequest(response_data, http_res)
388
+ if utils.match_response(http_res, "401", "application/json"):
389
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
390
+ response_data.http_meta = models.HTTPMetadata(
391
+ request=req, response=http_res
392
+ )
393
+ raise errors.Unauthorized(response_data, http_res)
394
+ if utils.match_response(http_res, "403", "application/json"):
395
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
396
+ response_data.http_meta = models.HTTPMetadata(
397
+ request=req, response=http_res
398
+ )
399
+ raise errors.Forbidden(response_data, http_res)
400
+ if utils.match_response(http_res, "404", "application/json"):
401
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
402
+ response_data.http_meta = models.HTTPMetadata(
403
+ request=req, response=http_res
404
+ )
405
+ raise errors.NotFound(response_data, http_res)
406
+ if utils.match_response(http_res, "500", "application/json"):
407
+ response_data = unmarshal_json_response(
408
+ errors.InternalServerErrorUnion, http_res
409
+ )
410
+ response_data.http_meta = models.HTTPMetadata(
411
+ request=req, response=http_res
412
+ )
413
+ raise errors.InternalServerError(response_data, http_res)
414
+ if utils.match_response(http_res, "4XX", "*"):
415
+ http_res_text = utils.stream_to_text(http_res)
416
+ raise errors.APIError("API error occurred", http_res, http_res_text)
417
+ if utils.match_response(http_res, "5XX", "*"):
418
+ http_res_text = utils.stream_to_text(http_res)
419
+ raise errors.APIError("API error occurred", http_res, http_res_text)
420
+
421
+ raise errors.APIError("Unexpected response received", http_res)
422
+
423
+ async def get_ebit_estimates_async(
424
+ self,
425
+ *,
426
+ symbol: str,
427
+ freq: Optional[models.ReportingFrequency] = None,
428
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
429
+ server_url: Optional[str] = None,
430
+ timeout_ms: Optional[int] = None,
431
+ http_headers: Optional[Mapping[str, str]] = None,
432
+ ) -> models.GetEbitEstimatesResponse:
433
+ r"""Get EBIT Estimates
434
+
435
+ Retrieve analyst EBIT (Earnings Before Interest and Taxes) estimates showing projected operating profitability.
436
+
437
+ If set, this operation will use `client_id` from the global security.
438
+
439
+ :param symbol: Stock ticker to query. Send the plain uppercase symbol exactly as you'd type it on a brokerage screen, e.g. `AAPL`, `MSFT`, `TSLA`.
440
+ :param freq: (Optional) Frequency: annual, quarterly
441
+ :param retries: Override the default retry configuration for this method
442
+ :param server_url: Override the default server URL for this method
443
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
444
+ :param http_headers: Additional headers to set or replace on requests.
445
+ """
446
+ base_url = None
447
+ url_variables = None
448
+ if timeout_ms is None:
449
+ timeout_ms = self.sdk_configuration.timeout_ms
450
+
451
+ if timeout_ms is None:
452
+ timeout_ms = 30000
453
+
454
+ if server_url is not None:
455
+ base_url = server_url
456
+ else:
457
+ base_url = self._get_url(base_url, url_variables)
458
+
459
+ request = models.GetEbitEstimatesRequest(
460
+ symbol=symbol,
461
+ freq=freq,
462
+ )
463
+
464
+ req = self._build_request_async(
465
+ method="GET",
466
+ path="/v1/stock/ebit-estimate",
467
+ base_url=base_url,
468
+ url_variables=url_variables,
469
+ request=request,
470
+ request_body_required=False,
471
+ request_has_path_params=False,
472
+ request_has_query_params=True,
473
+ user_agent_header="user-agent",
474
+ accept_header_value="application/json",
475
+ http_headers=http_headers,
476
+ security=self.sdk_configuration.security,
477
+ allow_empty_value=None,
478
+ allowed_fields=["client_id"],
479
+ timeout_ms=timeout_ms,
480
+ )
481
+
482
+ if retries == UNSET:
483
+ if self.sdk_configuration.retry_config is not UNSET:
484
+ retries = self.sdk_configuration.retry_config
485
+ else:
486
+ retries = utils.RetryConfig(
487
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
488
+ )
489
+
490
+ retry_config = None
491
+ if isinstance(retries, utils.RetryConfig):
492
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
493
+
494
+ http_res = await self.do_request_async(
495
+ hook_ctx=HookContext(
496
+ config=self.sdk_configuration,
497
+ base_url=base_url or "",
498
+ operation_id="getEbitEstimates",
499
+ oauth2_scopes=["market:supplemental"],
500
+ security_source=self.sdk_configuration.security,
501
+ tags=["Stock Estimates"],
502
+ extensions=None,
503
+ ),
504
+ request=req,
505
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
506
+ retry_config=retry_config,
507
+ )
508
+
509
+ response_data: Any = None
510
+ if utils.match_response(http_res, "200", "application/json"):
511
+ return models.GetEbitEstimatesResponse(
512
+ ebit_estimates_response=unmarshal_json_response(
513
+ Optional[models.EbitEstimatesResponse], http_res
514
+ ),
515
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
516
+ )
517
+ if utils.match_response(http_res, "400", "application/json"):
518
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
519
+ response_data.http_meta = models.HTTPMetadata(
520
+ request=req, response=http_res
521
+ )
522
+ raise errors.BadRequest(response_data, http_res)
523
+ if utils.match_response(http_res, "401", "application/json"):
524
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
525
+ response_data.http_meta = models.HTTPMetadata(
526
+ request=req, response=http_res
527
+ )
528
+ raise errors.Unauthorized(response_data, http_res)
529
+ if utils.match_response(http_res, "403", "application/json"):
530
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
531
+ response_data.http_meta = models.HTTPMetadata(
532
+ request=req, response=http_res
533
+ )
534
+ raise errors.Forbidden(response_data, http_res)
535
+ if utils.match_response(http_res, "404", "application/json"):
536
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
537
+ response_data.http_meta = models.HTTPMetadata(
538
+ request=req, response=http_res
539
+ )
540
+ raise errors.NotFound(response_data, http_res)
541
+ if utils.match_response(http_res, "500", "application/json"):
542
+ response_data = unmarshal_json_response(
543
+ errors.InternalServerErrorUnion, http_res
544
+ )
545
+ response_data.http_meta = models.HTTPMetadata(
546
+ request=req, response=http_res
547
+ )
548
+ raise errors.InternalServerError(response_data, http_res)
549
+ if utils.match_response(http_res, "4XX", "*"):
550
+ http_res_text = await utils.stream_to_text_async(http_res)
551
+ raise errors.APIError("API error occurred", http_res, http_res_text)
552
+ if utils.match_response(http_res, "5XX", "*"):
553
+ http_res_text = await utils.stream_to_text_async(http_res)
554
+ raise errors.APIError("API error occurred", http_res, http_res_text)
555
+
556
+ raise errors.APIError("Unexpected response received", http_res)
557
+
558
+ def get_ebitda_estimates(
559
+ self,
560
+ *,
561
+ symbol: str,
562
+ freq: Optional[models.ReportingFrequency] = None,
563
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
564
+ server_url: Optional[str] = None,
565
+ timeout_ms: Optional[int] = None,
566
+ http_headers: Optional[Mapping[str, str]] = None,
567
+ ) -> models.GetEbitdaEstimatesResponse:
568
+ r"""Get EBITDA Estimates
569
+
570
+ Retrieve analyst EBITDA (Earnings Before Interest, Taxes, Depreciation, and Amortization) estimates for profitability forecasting.
571
+
572
+ If set, this operation will use `client_id` from the global security.
573
+
574
+ :param symbol: Stock ticker to query. Send the plain uppercase symbol exactly as you'd type it on a brokerage screen, e.g. `AAPL`, `MSFT`, `TSLA`.
575
+ :param freq: (Optional) Frequency: annual, quarterly
576
+ :param retries: Override the default retry configuration for this method
577
+ :param server_url: Override the default server URL for this method
578
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
579
+ :param http_headers: Additional headers to set or replace on requests.
580
+ """
581
+ base_url = None
582
+ url_variables = None
583
+ if timeout_ms is None:
584
+ timeout_ms = self.sdk_configuration.timeout_ms
585
+
586
+ if timeout_ms is None:
587
+ timeout_ms = 30000
588
+
589
+ if server_url is not None:
590
+ base_url = server_url
591
+ else:
592
+ base_url = self._get_url(base_url, url_variables)
593
+
594
+ request = models.GetEbitdaEstimatesRequest(
595
+ symbol=symbol,
596
+ freq=freq,
597
+ )
598
+
599
+ req = self._build_request(
600
+ method="GET",
601
+ path="/v1/stock/ebitda-estimate",
602
+ base_url=base_url,
603
+ url_variables=url_variables,
604
+ request=request,
605
+ request_body_required=False,
606
+ request_has_path_params=False,
607
+ request_has_query_params=True,
608
+ user_agent_header="user-agent",
609
+ accept_header_value="application/json",
610
+ http_headers=http_headers,
611
+ security=self.sdk_configuration.security,
612
+ allow_empty_value=None,
613
+ allowed_fields=["client_id"],
614
+ timeout_ms=timeout_ms,
615
+ )
616
+
617
+ if retries == UNSET:
618
+ if self.sdk_configuration.retry_config is not UNSET:
619
+ retries = self.sdk_configuration.retry_config
620
+ else:
621
+ retries = utils.RetryConfig(
622
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
623
+ )
624
+
625
+ retry_config = None
626
+ if isinstance(retries, utils.RetryConfig):
627
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
628
+
629
+ http_res = self.do_request(
630
+ hook_ctx=HookContext(
631
+ config=self.sdk_configuration,
632
+ base_url=base_url or "",
633
+ operation_id="getEbitdaEstimates",
634
+ oauth2_scopes=["market:supplemental"],
635
+ security_source=self.sdk_configuration.security,
636
+ tags=["Stock Estimates"],
637
+ extensions=None,
638
+ ),
639
+ request=req,
640
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
641
+ retry_config=retry_config,
642
+ )
643
+
644
+ response_data: Any = None
645
+ if utils.match_response(http_res, "200", "application/json"):
646
+ return models.GetEbitdaEstimatesResponse(
647
+ ebitda_estimates_response=unmarshal_json_response(
648
+ Optional[models.EbitdaEstimatesResponse], http_res
649
+ ),
650
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
651
+ )
652
+ if utils.match_response(http_res, "400", "application/json"):
653
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
654
+ response_data.http_meta = models.HTTPMetadata(
655
+ request=req, response=http_res
656
+ )
657
+ raise errors.BadRequest(response_data, http_res)
658
+ if utils.match_response(http_res, "401", "application/json"):
659
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
660
+ response_data.http_meta = models.HTTPMetadata(
661
+ request=req, response=http_res
662
+ )
663
+ raise errors.Unauthorized(response_data, http_res)
664
+ if utils.match_response(http_res, "403", "application/json"):
665
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
666
+ response_data.http_meta = models.HTTPMetadata(
667
+ request=req, response=http_res
668
+ )
669
+ raise errors.Forbidden(response_data, http_res)
670
+ if utils.match_response(http_res, "404", "application/json"):
671
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
672
+ response_data.http_meta = models.HTTPMetadata(
673
+ request=req, response=http_res
674
+ )
675
+ raise errors.NotFound(response_data, http_res)
676
+ if utils.match_response(http_res, "500", "application/json"):
677
+ response_data = unmarshal_json_response(
678
+ errors.InternalServerErrorUnion, http_res
679
+ )
680
+ response_data.http_meta = models.HTTPMetadata(
681
+ request=req, response=http_res
682
+ )
683
+ raise errors.InternalServerError(response_data, http_res)
684
+ if utils.match_response(http_res, "4XX", "*"):
685
+ http_res_text = utils.stream_to_text(http_res)
686
+ raise errors.APIError("API error occurred", http_res, http_res_text)
687
+ if utils.match_response(http_res, "5XX", "*"):
688
+ http_res_text = utils.stream_to_text(http_res)
689
+ raise errors.APIError("API error occurred", http_res, http_res_text)
690
+
691
+ raise errors.APIError("Unexpected response received", http_res)
692
+
693
+ async def get_ebitda_estimates_async(
694
+ self,
695
+ *,
696
+ symbol: str,
697
+ freq: Optional[models.ReportingFrequency] = None,
698
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
699
+ server_url: Optional[str] = None,
700
+ timeout_ms: Optional[int] = None,
701
+ http_headers: Optional[Mapping[str, str]] = None,
702
+ ) -> models.GetEbitdaEstimatesResponse:
703
+ r"""Get EBITDA Estimates
704
+
705
+ Retrieve analyst EBITDA (Earnings Before Interest, Taxes, Depreciation, and Amortization) estimates for profitability forecasting.
706
+
707
+ If set, this operation will use `client_id` from the global security.
708
+
709
+ :param symbol: Stock ticker to query. Send the plain uppercase symbol exactly as you'd type it on a brokerage screen, e.g. `AAPL`, `MSFT`, `TSLA`.
710
+ :param freq: (Optional) Frequency: annual, quarterly
711
+ :param retries: Override the default retry configuration for this method
712
+ :param server_url: Override the default server URL for this method
713
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
714
+ :param http_headers: Additional headers to set or replace on requests.
715
+ """
716
+ base_url = None
717
+ url_variables = None
718
+ if timeout_ms is None:
719
+ timeout_ms = self.sdk_configuration.timeout_ms
720
+
721
+ if timeout_ms is None:
722
+ timeout_ms = 30000
723
+
724
+ if server_url is not None:
725
+ base_url = server_url
726
+ else:
727
+ base_url = self._get_url(base_url, url_variables)
728
+
729
+ request = models.GetEbitdaEstimatesRequest(
730
+ symbol=symbol,
731
+ freq=freq,
732
+ )
733
+
734
+ req = self._build_request_async(
735
+ method="GET",
736
+ path="/v1/stock/ebitda-estimate",
737
+ base_url=base_url,
738
+ url_variables=url_variables,
739
+ request=request,
740
+ request_body_required=False,
741
+ request_has_path_params=False,
742
+ request_has_query_params=True,
743
+ user_agent_header="user-agent",
744
+ accept_header_value="application/json",
745
+ http_headers=http_headers,
746
+ security=self.sdk_configuration.security,
747
+ allow_empty_value=None,
748
+ allowed_fields=["client_id"],
749
+ timeout_ms=timeout_ms,
750
+ )
751
+
752
+ if retries == UNSET:
753
+ if self.sdk_configuration.retry_config is not UNSET:
754
+ retries = self.sdk_configuration.retry_config
755
+ else:
756
+ retries = utils.RetryConfig(
757
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
758
+ )
759
+
760
+ retry_config = None
761
+ if isinstance(retries, utils.RetryConfig):
762
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
763
+
764
+ http_res = await self.do_request_async(
765
+ hook_ctx=HookContext(
766
+ config=self.sdk_configuration,
767
+ base_url=base_url or "",
768
+ operation_id="getEbitdaEstimates",
769
+ oauth2_scopes=["market:supplemental"],
770
+ security_source=self.sdk_configuration.security,
771
+ tags=["Stock Estimates"],
772
+ extensions=None,
773
+ ),
774
+ request=req,
775
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
776
+ retry_config=retry_config,
777
+ )
778
+
779
+ response_data: Any = None
780
+ if utils.match_response(http_res, "200", "application/json"):
781
+ return models.GetEbitdaEstimatesResponse(
782
+ ebitda_estimates_response=unmarshal_json_response(
783
+ Optional[models.EbitdaEstimatesResponse], http_res
784
+ ),
785
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
786
+ )
787
+ if utils.match_response(http_res, "400", "application/json"):
788
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
789
+ response_data.http_meta = models.HTTPMetadata(
790
+ request=req, response=http_res
791
+ )
792
+ raise errors.BadRequest(response_data, http_res)
793
+ if utils.match_response(http_res, "401", "application/json"):
794
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
795
+ response_data.http_meta = models.HTTPMetadata(
796
+ request=req, response=http_res
797
+ )
798
+ raise errors.Unauthorized(response_data, http_res)
799
+ if utils.match_response(http_res, "403", "application/json"):
800
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
801
+ response_data.http_meta = models.HTTPMetadata(
802
+ request=req, response=http_res
803
+ )
804
+ raise errors.Forbidden(response_data, http_res)
805
+ if utils.match_response(http_res, "404", "application/json"):
806
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
807
+ response_data.http_meta = models.HTTPMetadata(
808
+ request=req, response=http_res
809
+ )
810
+ raise errors.NotFound(response_data, http_res)
811
+ if utils.match_response(http_res, "500", "application/json"):
812
+ response_data = unmarshal_json_response(
813
+ errors.InternalServerErrorUnion, http_res
814
+ )
815
+ response_data.http_meta = models.HTTPMetadata(
816
+ request=req, response=http_res
817
+ )
818
+ raise errors.InternalServerError(response_data, http_res)
819
+ if utils.match_response(http_res, "4XX", "*"):
820
+ http_res_text = await utils.stream_to_text_async(http_res)
821
+ raise errors.APIError("API error occurred", http_res, http_res_text)
822
+ if utils.match_response(http_res, "5XX", "*"):
823
+ http_res_text = await utils.stream_to_text_async(http_res)
824
+ raise errors.APIError("API error occurred", http_res, http_res_text)
825
+
826
+ raise errors.APIError("Unexpected response received", http_res)
827
+
828
+ def get_eps_estimates(
829
+ self,
830
+ *,
831
+ symbol: str,
832
+ freq: Optional[models.ReportingFrequency] = None,
833
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
834
+ server_url: Optional[str] = None,
835
+ timeout_ms: Optional[int] = None,
836
+ http_headers: Optional[Mapping[str, str]] = None,
837
+ ) -> models.GetEpsEstimatesResponse:
838
+ r"""Get EPS Estimates
839
+
840
+ Retrieve analyst earnings per share (EPS) estimates including consensus forecasts, estimate ranges, and earnings growth projections.
841
+
842
+ If set, this operation will use `client_id` from the global security.
843
+
844
+ :param symbol: Stock ticker to query. Send the plain uppercase symbol exactly as you'd type it on a brokerage screen, e.g. `AAPL`, `MSFT`, `TSLA`.
845
+ :param freq: (Optional) Frequency: annual, quarterly
846
+ :param retries: Override the default retry configuration for this method
847
+ :param server_url: Override the default server URL for this method
848
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
849
+ :param http_headers: Additional headers to set or replace on requests.
850
+ """
851
+ base_url = None
852
+ url_variables = None
853
+ if timeout_ms is None:
854
+ timeout_ms = self.sdk_configuration.timeout_ms
855
+
856
+ if timeout_ms is None:
857
+ timeout_ms = 30000
858
+
859
+ if server_url is not None:
860
+ base_url = server_url
861
+ else:
862
+ base_url = self._get_url(base_url, url_variables)
863
+
864
+ request = models.GetEpsEstimatesRequest(
865
+ symbol=symbol,
866
+ freq=freq,
867
+ )
868
+
869
+ req = self._build_request(
870
+ method="GET",
871
+ path="/v1/stock/eps-estimate",
872
+ base_url=base_url,
873
+ url_variables=url_variables,
874
+ request=request,
875
+ request_body_required=False,
876
+ request_has_path_params=False,
877
+ request_has_query_params=True,
878
+ user_agent_header="user-agent",
879
+ accept_header_value="application/json",
880
+ http_headers=http_headers,
881
+ security=self.sdk_configuration.security,
882
+ allow_empty_value=None,
883
+ allowed_fields=["client_id"],
884
+ timeout_ms=timeout_ms,
885
+ )
886
+
887
+ if retries == UNSET:
888
+ if self.sdk_configuration.retry_config is not UNSET:
889
+ retries = self.sdk_configuration.retry_config
890
+ else:
891
+ retries = utils.RetryConfig(
892
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
893
+ )
894
+
895
+ retry_config = None
896
+ if isinstance(retries, utils.RetryConfig):
897
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
898
+
899
+ http_res = self.do_request(
900
+ hook_ctx=HookContext(
901
+ config=self.sdk_configuration,
902
+ base_url=base_url or "",
903
+ operation_id="getEpsEstimates",
904
+ oauth2_scopes=["market:supplemental"],
905
+ security_source=self.sdk_configuration.security,
906
+ tags=["Stock Estimates"],
907
+ extensions=None,
908
+ ),
909
+ request=req,
910
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
911
+ retry_config=retry_config,
912
+ )
913
+
914
+ response_data: Any = None
915
+ if utils.match_response(http_res, "200", "application/json"):
916
+ return models.GetEpsEstimatesResponse(
917
+ eps_estimates_response=unmarshal_json_response(
918
+ Optional[models.EpsEstimatesResponse], http_res
919
+ ),
920
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
921
+ )
922
+ if utils.match_response(http_res, "400", "application/json"):
923
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
924
+ response_data.http_meta = models.HTTPMetadata(
925
+ request=req, response=http_res
926
+ )
927
+ raise errors.BadRequest(response_data, http_res)
928
+ if utils.match_response(http_res, "401", "application/json"):
929
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
930
+ response_data.http_meta = models.HTTPMetadata(
931
+ request=req, response=http_res
932
+ )
933
+ raise errors.Unauthorized(response_data, http_res)
934
+ if utils.match_response(http_res, "403", "application/json"):
935
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
936
+ response_data.http_meta = models.HTTPMetadata(
937
+ request=req, response=http_res
938
+ )
939
+ raise errors.Forbidden(response_data, http_res)
940
+ if utils.match_response(http_res, "404", "application/json"):
941
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
942
+ response_data.http_meta = models.HTTPMetadata(
943
+ request=req, response=http_res
944
+ )
945
+ raise errors.NotFound(response_data, http_res)
946
+ if utils.match_response(http_res, "500", "application/json"):
947
+ response_data = unmarshal_json_response(
948
+ errors.InternalServerErrorUnion, http_res
949
+ )
950
+ response_data.http_meta = models.HTTPMetadata(
951
+ request=req, response=http_res
952
+ )
953
+ raise errors.InternalServerError(response_data, http_res)
954
+ if utils.match_response(http_res, "4XX", "*"):
955
+ http_res_text = utils.stream_to_text(http_res)
956
+ raise errors.APIError("API error occurred", http_res, http_res_text)
957
+ if utils.match_response(http_res, "5XX", "*"):
958
+ http_res_text = utils.stream_to_text(http_res)
959
+ raise errors.APIError("API error occurred", http_res, http_res_text)
960
+
961
+ raise errors.APIError("Unexpected response received", http_res)
962
+
963
+ async def get_eps_estimates_async(
964
+ self,
965
+ *,
966
+ symbol: str,
967
+ freq: Optional[models.ReportingFrequency] = None,
968
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
969
+ server_url: Optional[str] = None,
970
+ timeout_ms: Optional[int] = None,
971
+ http_headers: Optional[Mapping[str, str]] = None,
972
+ ) -> models.GetEpsEstimatesResponse:
973
+ r"""Get EPS Estimates
974
+
975
+ Retrieve analyst earnings per share (EPS) estimates including consensus forecasts, estimate ranges, and earnings growth projections.
976
+
977
+ If set, this operation will use `client_id` from the global security.
978
+
979
+ :param symbol: Stock ticker to query. Send the plain uppercase symbol exactly as you'd type it on a brokerage screen, e.g. `AAPL`, `MSFT`, `TSLA`.
980
+ :param freq: (Optional) Frequency: annual, quarterly
981
+ :param retries: Override the default retry configuration for this method
982
+ :param server_url: Override the default server URL for this method
983
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
984
+ :param http_headers: Additional headers to set or replace on requests.
985
+ """
986
+ base_url = None
987
+ url_variables = None
988
+ if timeout_ms is None:
989
+ timeout_ms = self.sdk_configuration.timeout_ms
990
+
991
+ if timeout_ms is None:
992
+ timeout_ms = 30000
993
+
994
+ if server_url is not None:
995
+ base_url = server_url
996
+ else:
997
+ base_url = self._get_url(base_url, url_variables)
998
+
999
+ request = models.GetEpsEstimatesRequest(
1000
+ symbol=symbol,
1001
+ freq=freq,
1002
+ )
1003
+
1004
+ req = self._build_request_async(
1005
+ method="GET",
1006
+ path="/v1/stock/eps-estimate",
1007
+ base_url=base_url,
1008
+ url_variables=url_variables,
1009
+ request=request,
1010
+ request_body_required=False,
1011
+ request_has_path_params=False,
1012
+ request_has_query_params=True,
1013
+ user_agent_header="user-agent",
1014
+ accept_header_value="application/json",
1015
+ http_headers=http_headers,
1016
+ security=self.sdk_configuration.security,
1017
+ allow_empty_value=None,
1018
+ allowed_fields=["client_id"],
1019
+ timeout_ms=timeout_ms,
1020
+ )
1021
+
1022
+ if retries == UNSET:
1023
+ if self.sdk_configuration.retry_config is not UNSET:
1024
+ retries = self.sdk_configuration.retry_config
1025
+ else:
1026
+ retries = utils.RetryConfig(
1027
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
1028
+ )
1029
+
1030
+ retry_config = None
1031
+ if isinstance(retries, utils.RetryConfig):
1032
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
1033
+
1034
+ http_res = await self.do_request_async(
1035
+ hook_ctx=HookContext(
1036
+ config=self.sdk_configuration,
1037
+ base_url=base_url or "",
1038
+ operation_id="getEpsEstimates",
1039
+ oauth2_scopes=["market:supplemental"],
1040
+ security_source=self.sdk_configuration.security,
1041
+ tags=["Stock Estimates"],
1042
+ extensions=None,
1043
+ ),
1044
+ request=req,
1045
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
1046
+ retry_config=retry_config,
1047
+ )
1048
+
1049
+ response_data: Any = None
1050
+ if utils.match_response(http_res, "200", "application/json"):
1051
+ return models.GetEpsEstimatesResponse(
1052
+ eps_estimates_response=unmarshal_json_response(
1053
+ Optional[models.EpsEstimatesResponse], http_res
1054
+ ),
1055
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
1056
+ )
1057
+ if utils.match_response(http_res, "400", "application/json"):
1058
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
1059
+ response_data.http_meta = models.HTTPMetadata(
1060
+ request=req, response=http_res
1061
+ )
1062
+ raise errors.BadRequest(response_data, http_res)
1063
+ if utils.match_response(http_res, "401", "application/json"):
1064
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
1065
+ response_data.http_meta = models.HTTPMetadata(
1066
+ request=req, response=http_res
1067
+ )
1068
+ raise errors.Unauthorized(response_data, http_res)
1069
+ if utils.match_response(http_res, "403", "application/json"):
1070
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
1071
+ response_data.http_meta = models.HTTPMetadata(
1072
+ request=req, response=http_res
1073
+ )
1074
+ raise errors.Forbidden(response_data, http_res)
1075
+ if utils.match_response(http_res, "404", "application/json"):
1076
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
1077
+ response_data.http_meta = models.HTTPMetadata(
1078
+ request=req, response=http_res
1079
+ )
1080
+ raise errors.NotFound(response_data, http_res)
1081
+ if utils.match_response(http_res, "500", "application/json"):
1082
+ response_data = unmarshal_json_response(
1083
+ errors.InternalServerErrorUnion, http_res
1084
+ )
1085
+ response_data.http_meta = models.HTTPMetadata(
1086
+ request=req, response=http_res
1087
+ )
1088
+ raise errors.InternalServerError(response_data, http_res)
1089
+ if utils.match_response(http_res, "4XX", "*"):
1090
+ http_res_text = await utils.stream_to_text_async(http_res)
1091
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1092
+ if utils.match_response(http_res, "5XX", "*"):
1093
+ http_res_text = await utils.stream_to_text_async(http_res)
1094
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1095
+
1096
+ raise errors.APIError("Unexpected response received", http_res)
1097
+
1098
+ def get_price_target(
1099
+ self,
1100
+ *,
1101
+ symbol: str,
1102
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
1103
+ server_url: Optional[str] = None,
1104
+ timeout_ms: Optional[int] = None,
1105
+ http_headers: Optional[Mapping[str, str]] = None,
1106
+ ) -> models.GetPriceTargetResponse:
1107
+ r"""Get Analyst Price Targets
1108
+
1109
+ Retrieve analyst price targets including consensus estimates, high/low targets, and individual analyst projections for stock valuation.
1110
+
1111
+ If set, this operation will use `client_id` from the global security.
1112
+
1113
+ :param symbol: Stock ticker to query. Send the plain uppercase symbol exactly as you'd type it on a brokerage screen, e.g. `AAPL`, `MSFT`, `TSLA`.
1114
+ :param retries: Override the default retry configuration for this method
1115
+ :param server_url: Override the default server URL for this method
1116
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
1117
+ :param http_headers: Additional headers to set or replace on requests.
1118
+ """
1119
+ base_url = None
1120
+ url_variables = None
1121
+ if timeout_ms is None:
1122
+ timeout_ms = self.sdk_configuration.timeout_ms
1123
+
1124
+ if timeout_ms is None:
1125
+ timeout_ms = 30000
1126
+
1127
+ if server_url is not None:
1128
+ base_url = server_url
1129
+ else:
1130
+ base_url = self._get_url(base_url, url_variables)
1131
+
1132
+ request = models.GetPriceTargetRequest(
1133
+ symbol=symbol,
1134
+ )
1135
+
1136
+ req = self._build_request(
1137
+ method="GET",
1138
+ path="/v1/stock/price-target",
1139
+ base_url=base_url,
1140
+ url_variables=url_variables,
1141
+ request=request,
1142
+ request_body_required=False,
1143
+ request_has_path_params=False,
1144
+ request_has_query_params=True,
1145
+ user_agent_header="user-agent",
1146
+ accept_header_value="application/json",
1147
+ http_headers=http_headers,
1148
+ security=self.sdk_configuration.security,
1149
+ allow_empty_value=None,
1150
+ allowed_fields=["client_id"],
1151
+ timeout_ms=timeout_ms,
1152
+ )
1153
+
1154
+ if retries == UNSET:
1155
+ if self.sdk_configuration.retry_config is not UNSET:
1156
+ retries = self.sdk_configuration.retry_config
1157
+ else:
1158
+ retries = utils.RetryConfig(
1159
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
1160
+ )
1161
+
1162
+ retry_config = None
1163
+ if isinstance(retries, utils.RetryConfig):
1164
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
1165
+
1166
+ http_res = self.do_request(
1167
+ hook_ctx=HookContext(
1168
+ config=self.sdk_configuration,
1169
+ base_url=base_url or "",
1170
+ operation_id="getPriceTarget",
1171
+ oauth2_scopes=["market:supplemental"],
1172
+ security_source=self.sdk_configuration.security,
1173
+ tags=["Stock Estimates"],
1174
+ extensions=None,
1175
+ ),
1176
+ request=req,
1177
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
1178
+ retry_config=retry_config,
1179
+ )
1180
+
1181
+ response_data: Any = None
1182
+ if utils.match_response(http_res, "200", "application/json"):
1183
+ return models.GetPriceTargetResponse(
1184
+ price_target_response=unmarshal_json_response(
1185
+ Optional[models.PriceTargetResponse], http_res
1186
+ ),
1187
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
1188
+ )
1189
+ if utils.match_response(http_res, "400", "application/json"):
1190
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
1191
+ response_data.http_meta = models.HTTPMetadata(
1192
+ request=req, response=http_res
1193
+ )
1194
+ raise errors.BadRequest(response_data, http_res)
1195
+ if utils.match_response(http_res, "401", "application/json"):
1196
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
1197
+ response_data.http_meta = models.HTTPMetadata(
1198
+ request=req, response=http_res
1199
+ )
1200
+ raise errors.Unauthorized(response_data, http_res)
1201
+ if utils.match_response(http_res, "403", "application/json"):
1202
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
1203
+ response_data.http_meta = models.HTTPMetadata(
1204
+ request=req, response=http_res
1205
+ )
1206
+ raise errors.Forbidden(response_data, http_res)
1207
+ if utils.match_response(http_res, "404", "application/json"):
1208
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
1209
+ response_data.http_meta = models.HTTPMetadata(
1210
+ request=req, response=http_res
1211
+ )
1212
+ raise errors.NotFound(response_data, http_res)
1213
+ if utils.match_response(http_res, "500", "application/json"):
1214
+ response_data = unmarshal_json_response(
1215
+ errors.InternalServerErrorUnion, http_res
1216
+ )
1217
+ response_data.http_meta = models.HTTPMetadata(
1218
+ request=req, response=http_res
1219
+ )
1220
+ raise errors.InternalServerError(response_data, http_res)
1221
+ if utils.match_response(http_res, "4XX", "*"):
1222
+ http_res_text = utils.stream_to_text(http_res)
1223
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1224
+ if utils.match_response(http_res, "5XX", "*"):
1225
+ http_res_text = utils.stream_to_text(http_res)
1226
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1227
+
1228
+ raise errors.APIError("Unexpected response received", http_res)
1229
+
1230
+ async def get_price_target_async(
1231
+ self,
1232
+ *,
1233
+ symbol: str,
1234
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
1235
+ server_url: Optional[str] = None,
1236
+ timeout_ms: Optional[int] = None,
1237
+ http_headers: Optional[Mapping[str, str]] = None,
1238
+ ) -> models.GetPriceTargetResponse:
1239
+ r"""Get Analyst Price Targets
1240
+
1241
+ Retrieve analyst price targets including consensus estimates, high/low targets, and individual analyst projections for stock valuation.
1242
+
1243
+ If set, this operation will use `client_id` from the global security.
1244
+
1245
+ :param symbol: Stock ticker to query. Send the plain uppercase symbol exactly as you'd type it on a brokerage screen, e.g. `AAPL`, `MSFT`, `TSLA`.
1246
+ :param retries: Override the default retry configuration for this method
1247
+ :param server_url: Override the default server URL for this method
1248
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
1249
+ :param http_headers: Additional headers to set or replace on requests.
1250
+ """
1251
+ base_url = None
1252
+ url_variables = None
1253
+ if timeout_ms is None:
1254
+ timeout_ms = self.sdk_configuration.timeout_ms
1255
+
1256
+ if timeout_ms is None:
1257
+ timeout_ms = 30000
1258
+
1259
+ if server_url is not None:
1260
+ base_url = server_url
1261
+ else:
1262
+ base_url = self._get_url(base_url, url_variables)
1263
+
1264
+ request = models.GetPriceTargetRequest(
1265
+ symbol=symbol,
1266
+ )
1267
+
1268
+ req = self._build_request_async(
1269
+ method="GET",
1270
+ path="/v1/stock/price-target",
1271
+ base_url=base_url,
1272
+ url_variables=url_variables,
1273
+ request=request,
1274
+ request_body_required=False,
1275
+ request_has_path_params=False,
1276
+ request_has_query_params=True,
1277
+ user_agent_header="user-agent",
1278
+ accept_header_value="application/json",
1279
+ http_headers=http_headers,
1280
+ security=self.sdk_configuration.security,
1281
+ allow_empty_value=None,
1282
+ allowed_fields=["client_id"],
1283
+ timeout_ms=timeout_ms,
1284
+ )
1285
+
1286
+ if retries == UNSET:
1287
+ if self.sdk_configuration.retry_config is not UNSET:
1288
+ retries = self.sdk_configuration.retry_config
1289
+ else:
1290
+ retries = utils.RetryConfig(
1291
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
1292
+ )
1293
+
1294
+ retry_config = None
1295
+ if isinstance(retries, utils.RetryConfig):
1296
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
1297
+
1298
+ http_res = await self.do_request_async(
1299
+ hook_ctx=HookContext(
1300
+ config=self.sdk_configuration,
1301
+ base_url=base_url or "",
1302
+ operation_id="getPriceTarget",
1303
+ oauth2_scopes=["market:supplemental"],
1304
+ security_source=self.sdk_configuration.security,
1305
+ tags=["Stock Estimates"],
1306
+ extensions=None,
1307
+ ),
1308
+ request=req,
1309
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
1310
+ retry_config=retry_config,
1311
+ )
1312
+
1313
+ response_data: Any = None
1314
+ if utils.match_response(http_res, "200", "application/json"):
1315
+ return models.GetPriceTargetResponse(
1316
+ price_target_response=unmarshal_json_response(
1317
+ Optional[models.PriceTargetResponse], http_res
1318
+ ),
1319
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
1320
+ )
1321
+ if utils.match_response(http_res, "400", "application/json"):
1322
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
1323
+ response_data.http_meta = models.HTTPMetadata(
1324
+ request=req, response=http_res
1325
+ )
1326
+ raise errors.BadRequest(response_data, http_res)
1327
+ if utils.match_response(http_res, "401", "application/json"):
1328
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
1329
+ response_data.http_meta = models.HTTPMetadata(
1330
+ request=req, response=http_res
1331
+ )
1332
+ raise errors.Unauthorized(response_data, http_res)
1333
+ if utils.match_response(http_res, "403", "application/json"):
1334
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
1335
+ response_data.http_meta = models.HTTPMetadata(
1336
+ request=req, response=http_res
1337
+ )
1338
+ raise errors.Forbidden(response_data, http_res)
1339
+ if utils.match_response(http_res, "404", "application/json"):
1340
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
1341
+ response_data.http_meta = models.HTTPMetadata(
1342
+ request=req, response=http_res
1343
+ )
1344
+ raise errors.NotFound(response_data, http_res)
1345
+ if utils.match_response(http_res, "500", "application/json"):
1346
+ response_data = unmarshal_json_response(
1347
+ errors.InternalServerErrorUnion, http_res
1348
+ )
1349
+ response_data.http_meta = models.HTTPMetadata(
1350
+ request=req, response=http_res
1351
+ )
1352
+ raise errors.InternalServerError(response_data, http_res)
1353
+ if utils.match_response(http_res, "4XX", "*"):
1354
+ http_res_text = await utils.stream_to_text_async(http_res)
1355
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1356
+ if utils.match_response(http_res, "5XX", "*"):
1357
+ http_res_text = await utils.stream_to_text_async(http_res)
1358
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1359
+
1360
+ raise errors.APIError("Unexpected response received", http_res)
1361
+
1362
+ def get_revenue_estimates(
1363
+ self,
1364
+ *,
1365
+ symbol: str,
1366
+ freq: Optional[models.ReportingFrequency] = None,
1367
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
1368
+ server_url: Optional[str] = None,
1369
+ timeout_ms: Optional[int] = None,
1370
+ http_headers: Optional[Mapping[str, str]] = None,
1371
+ ) -> models.GetRevenueEstimatesResponse:
1372
+ r"""Get Revenue Estimates
1373
+
1374
+ Retrieve analyst revenue estimates including quarterly and annual projections with consensus forecasts and estimate revisions.
1375
+
1376
+ If set, this operation will use `client_id` from the global security.
1377
+
1378
+ :param symbol: Stock ticker to query. Send the plain uppercase symbol exactly as you'd type it on a brokerage screen, e.g. `AAPL`, `MSFT`, `TSLA`.
1379
+ :param freq: (Optional) Frequency: annual, quarterly
1380
+ :param retries: Override the default retry configuration for this method
1381
+ :param server_url: Override the default server URL for this method
1382
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
1383
+ :param http_headers: Additional headers to set or replace on requests.
1384
+ """
1385
+ base_url = None
1386
+ url_variables = None
1387
+ if timeout_ms is None:
1388
+ timeout_ms = self.sdk_configuration.timeout_ms
1389
+
1390
+ if timeout_ms is None:
1391
+ timeout_ms = 30000
1392
+
1393
+ if server_url is not None:
1394
+ base_url = server_url
1395
+ else:
1396
+ base_url = self._get_url(base_url, url_variables)
1397
+
1398
+ request = models.GetRevenueEstimatesRequest(
1399
+ symbol=symbol,
1400
+ freq=freq,
1401
+ )
1402
+
1403
+ req = self._build_request(
1404
+ method="GET",
1405
+ path="/v1/stock/revenue-estimate",
1406
+ base_url=base_url,
1407
+ url_variables=url_variables,
1408
+ request=request,
1409
+ request_body_required=False,
1410
+ request_has_path_params=False,
1411
+ request_has_query_params=True,
1412
+ user_agent_header="user-agent",
1413
+ accept_header_value="application/json",
1414
+ http_headers=http_headers,
1415
+ security=self.sdk_configuration.security,
1416
+ allow_empty_value=None,
1417
+ allowed_fields=["client_id"],
1418
+ timeout_ms=timeout_ms,
1419
+ )
1420
+
1421
+ if retries == UNSET:
1422
+ if self.sdk_configuration.retry_config is not UNSET:
1423
+ retries = self.sdk_configuration.retry_config
1424
+ else:
1425
+ retries = utils.RetryConfig(
1426
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
1427
+ )
1428
+
1429
+ retry_config = None
1430
+ if isinstance(retries, utils.RetryConfig):
1431
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
1432
+
1433
+ http_res = self.do_request(
1434
+ hook_ctx=HookContext(
1435
+ config=self.sdk_configuration,
1436
+ base_url=base_url or "",
1437
+ operation_id="getRevenueEstimates",
1438
+ oauth2_scopes=["market:supplemental"],
1439
+ security_source=self.sdk_configuration.security,
1440
+ tags=["Stock Estimates"],
1441
+ extensions=None,
1442
+ ),
1443
+ request=req,
1444
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
1445
+ retry_config=retry_config,
1446
+ )
1447
+
1448
+ response_data: Any = None
1449
+ if utils.match_response(http_res, "200", "application/json"):
1450
+ return models.GetRevenueEstimatesResponse(
1451
+ revenue_estimates_response=unmarshal_json_response(
1452
+ Optional[models.RevenueEstimatesResponse], http_res
1453
+ ),
1454
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
1455
+ )
1456
+ if utils.match_response(http_res, "400", "application/json"):
1457
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
1458
+ response_data.http_meta = models.HTTPMetadata(
1459
+ request=req, response=http_res
1460
+ )
1461
+ raise errors.BadRequest(response_data, http_res)
1462
+ if utils.match_response(http_res, "401", "application/json"):
1463
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
1464
+ response_data.http_meta = models.HTTPMetadata(
1465
+ request=req, response=http_res
1466
+ )
1467
+ raise errors.Unauthorized(response_data, http_res)
1468
+ if utils.match_response(http_res, "403", "application/json"):
1469
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
1470
+ response_data.http_meta = models.HTTPMetadata(
1471
+ request=req, response=http_res
1472
+ )
1473
+ raise errors.Forbidden(response_data, http_res)
1474
+ if utils.match_response(http_res, "404", "application/json"):
1475
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
1476
+ response_data.http_meta = models.HTTPMetadata(
1477
+ request=req, response=http_res
1478
+ )
1479
+ raise errors.NotFound(response_data, http_res)
1480
+ if utils.match_response(http_res, "500", "application/json"):
1481
+ response_data = unmarshal_json_response(
1482
+ errors.InternalServerErrorUnion, http_res
1483
+ )
1484
+ response_data.http_meta = models.HTTPMetadata(
1485
+ request=req, response=http_res
1486
+ )
1487
+ raise errors.InternalServerError(response_data, http_res)
1488
+ if utils.match_response(http_res, "4XX", "*"):
1489
+ http_res_text = utils.stream_to_text(http_res)
1490
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1491
+ if utils.match_response(http_res, "5XX", "*"):
1492
+ http_res_text = utils.stream_to_text(http_res)
1493
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1494
+
1495
+ raise errors.APIError("Unexpected response received", http_res)
1496
+
1497
+ async def get_revenue_estimates_async(
1498
+ self,
1499
+ *,
1500
+ symbol: str,
1501
+ freq: Optional[models.ReportingFrequency] = None,
1502
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
1503
+ server_url: Optional[str] = None,
1504
+ timeout_ms: Optional[int] = None,
1505
+ http_headers: Optional[Mapping[str, str]] = None,
1506
+ ) -> models.GetRevenueEstimatesResponse:
1507
+ r"""Get Revenue Estimates
1508
+
1509
+ Retrieve analyst revenue estimates including quarterly and annual projections with consensus forecasts and estimate revisions.
1510
+
1511
+ If set, this operation will use `client_id` from the global security.
1512
+
1513
+ :param symbol: Stock ticker to query. Send the plain uppercase symbol exactly as you'd type it on a brokerage screen, e.g. `AAPL`, `MSFT`, `TSLA`.
1514
+ :param freq: (Optional) Frequency: annual, quarterly
1515
+ :param retries: Override the default retry configuration for this method
1516
+ :param server_url: Override the default server URL for this method
1517
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
1518
+ :param http_headers: Additional headers to set or replace on requests.
1519
+ """
1520
+ base_url = None
1521
+ url_variables = None
1522
+ if timeout_ms is None:
1523
+ timeout_ms = self.sdk_configuration.timeout_ms
1524
+
1525
+ if timeout_ms is None:
1526
+ timeout_ms = 30000
1527
+
1528
+ if server_url is not None:
1529
+ base_url = server_url
1530
+ else:
1531
+ base_url = self._get_url(base_url, url_variables)
1532
+
1533
+ request = models.GetRevenueEstimatesRequest(
1534
+ symbol=symbol,
1535
+ freq=freq,
1536
+ )
1537
+
1538
+ req = self._build_request_async(
1539
+ method="GET",
1540
+ path="/v1/stock/revenue-estimate",
1541
+ base_url=base_url,
1542
+ url_variables=url_variables,
1543
+ request=request,
1544
+ request_body_required=False,
1545
+ request_has_path_params=False,
1546
+ request_has_query_params=True,
1547
+ user_agent_header="user-agent",
1548
+ accept_header_value="application/json",
1549
+ http_headers=http_headers,
1550
+ security=self.sdk_configuration.security,
1551
+ allow_empty_value=None,
1552
+ allowed_fields=["client_id"],
1553
+ timeout_ms=timeout_ms,
1554
+ )
1555
+
1556
+ if retries == UNSET:
1557
+ if self.sdk_configuration.retry_config is not UNSET:
1558
+ retries = self.sdk_configuration.retry_config
1559
+ else:
1560
+ retries = utils.RetryConfig(
1561
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
1562
+ )
1563
+
1564
+ retry_config = None
1565
+ if isinstance(retries, utils.RetryConfig):
1566
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
1567
+
1568
+ http_res = await self.do_request_async(
1569
+ hook_ctx=HookContext(
1570
+ config=self.sdk_configuration,
1571
+ base_url=base_url or "",
1572
+ operation_id="getRevenueEstimates",
1573
+ oauth2_scopes=["market:supplemental"],
1574
+ security_source=self.sdk_configuration.security,
1575
+ tags=["Stock Estimates"],
1576
+ extensions=None,
1577
+ ),
1578
+ request=req,
1579
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
1580
+ retry_config=retry_config,
1581
+ )
1582
+
1583
+ response_data: Any = None
1584
+ if utils.match_response(http_res, "200", "application/json"):
1585
+ return models.GetRevenueEstimatesResponse(
1586
+ revenue_estimates_response=unmarshal_json_response(
1587
+ Optional[models.RevenueEstimatesResponse], http_res
1588
+ ),
1589
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
1590
+ )
1591
+ if utils.match_response(http_res, "400", "application/json"):
1592
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
1593
+ response_data.http_meta = models.HTTPMetadata(
1594
+ request=req, response=http_res
1595
+ )
1596
+ raise errors.BadRequest(response_data, http_res)
1597
+ if utils.match_response(http_res, "401", "application/json"):
1598
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
1599
+ response_data.http_meta = models.HTTPMetadata(
1600
+ request=req, response=http_res
1601
+ )
1602
+ raise errors.Unauthorized(response_data, http_res)
1603
+ if utils.match_response(http_res, "403", "application/json"):
1604
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
1605
+ response_data.http_meta = models.HTTPMetadata(
1606
+ request=req, response=http_res
1607
+ )
1608
+ raise errors.Forbidden(response_data, http_res)
1609
+ if utils.match_response(http_res, "404", "application/json"):
1610
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
1611
+ response_data.http_meta = models.HTTPMetadata(
1612
+ request=req, response=http_res
1613
+ )
1614
+ raise errors.NotFound(response_data, http_res)
1615
+ if utils.match_response(http_res, "500", "application/json"):
1616
+ response_data = unmarshal_json_response(
1617
+ errors.InternalServerErrorUnion, http_res
1618
+ )
1619
+ response_data.http_meta = models.HTTPMetadata(
1620
+ request=req, response=http_res
1621
+ )
1622
+ raise errors.InternalServerError(response_data, http_res)
1623
+ if utils.match_response(http_res, "4XX", "*"):
1624
+ http_res_text = await utils.stream_to_text_async(http_res)
1625
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1626
+ if utils.match_response(http_res, "5XX", "*"):
1627
+ http_res_text = await utils.stream_to_text_async(http_res)
1628
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1629
+
1630
+ raise errors.APIError("Unexpected response received", http_res)
1631
+
1632
+ def get_upgrades_downgrades(
1633
+ self,
1634
+ *,
1635
+ symbol: Optional[str] = None,
1636
+ from_: Optional[date] = None,
1637
+ to: Optional[date] = None,
1638
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
1639
+ server_url: Optional[str] = None,
1640
+ timeout_ms: Optional[int] = None,
1641
+ http_headers: Optional[Mapping[str, str]] = None,
1642
+ ) -> models.GetUpgradesDowngradesResponse:
1643
+ r"""Get Analyst Upgrades & Downgrades
1644
+
1645
+ Retrieve analyst rating changes including upgrades, downgrades, and reiterations from investment banks and research firms.
1646
+
1647
+ If set, this operation will use `client_id` from the global security.
1648
+
1649
+ :param symbol: Stock ticker to filter by. Send the plain uppercase symbol (e.g. `AAPL`). Omit to return data across all symbols.
1650
+ :param from_: Start of the date window, inclusive. Format: `YYYY-MM-DD` (e.g. `2024-01-01`). Omit to read from the earliest available data.
1651
+ :param to: End of the date window, inclusive. Format: `YYYY-MM-DD` (e.g. `2024-12-31`). Omit to read up to today.
1652
+ :param retries: Override the default retry configuration for this method
1653
+ :param server_url: Override the default server URL for this method
1654
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
1655
+ :param http_headers: Additional headers to set or replace on requests.
1656
+ """
1657
+ base_url = None
1658
+ url_variables = None
1659
+ if timeout_ms is None:
1660
+ timeout_ms = self.sdk_configuration.timeout_ms
1661
+
1662
+ if timeout_ms is None:
1663
+ timeout_ms = 30000
1664
+
1665
+ if server_url is not None:
1666
+ base_url = server_url
1667
+ else:
1668
+ base_url = self._get_url(base_url, url_variables)
1669
+
1670
+ request = models.GetUpgradesDowngradesRequest(
1671
+ symbol=symbol,
1672
+ from_=from_,
1673
+ to=to,
1674
+ )
1675
+
1676
+ req = self._build_request(
1677
+ method="GET",
1678
+ path="/v1/stock/upgrade-downgrade",
1679
+ base_url=base_url,
1680
+ url_variables=url_variables,
1681
+ request=request,
1682
+ request_body_required=False,
1683
+ request_has_path_params=False,
1684
+ request_has_query_params=True,
1685
+ user_agent_header="user-agent",
1686
+ accept_header_value="application/json",
1687
+ http_headers=http_headers,
1688
+ security=self.sdk_configuration.security,
1689
+ allow_empty_value=None,
1690
+ allowed_fields=["client_id"],
1691
+ timeout_ms=timeout_ms,
1692
+ )
1693
+
1694
+ if retries == UNSET:
1695
+ if self.sdk_configuration.retry_config is not UNSET:
1696
+ retries = self.sdk_configuration.retry_config
1697
+ else:
1698
+ retries = utils.RetryConfig(
1699
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
1700
+ )
1701
+
1702
+ retry_config = None
1703
+ if isinstance(retries, utils.RetryConfig):
1704
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
1705
+
1706
+ http_res = self.do_request(
1707
+ hook_ctx=HookContext(
1708
+ config=self.sdk_configuration,
1709
+ base_url=base_url or "",
1710
+ operation_id="getUpgradesDowngrades",
1711
+ oauth2_scopes=["market:supplemental"],
1712
+ security_source=self.sdk_configuration.security,
1713
+ tags=["Stock Estimates"],
1714
+ extensions=None,
1715
+ ),
1716
+ request=req,
1717
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
1718
+ retry_config=retry_config,
1719
+ )
1720
+
1721
+ response_data: Any = None
1722
+ if utils.match_response(http_res, "200", "application/json"):
1723
+ return models.GetUpgradesDowngradesResponse(
1724
+ upgrades_downgrades_response=unmarshal_json_response(
1725
+ Optional[models.UpgradesDowngradesResponse], http_res
1726
+ ),
1727
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
1728
+ )
1729
+ if utils.match_response(http_res, "400", "application/json"):
1730
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
1731
+ response_data.http_meta = models.HTTPMetadata(
1732
+ request=req, response=http_res
1733
+ )
1734
+ raise errors.BadRequest(response_data, http_res)
1735
+ if utils.match_response(http_res, "401", "application/json"):
1736
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
1737
+ response_data.http_meta = models.HTTPMetadata(
1738
+ request=req, response=http_res
1739
+ )
1740
+ raise errors.Unauthorized(response_data, http_res)
1741
+ if utils.match_response(http_res, "403", "application/json"):
1742
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
1743
+ response_data.http_meta = models.HTTPMetadata(
1744
+ request=req, response=http_res
1745
+ )
1746
+ raise errors.Forbidden(response_data, http_res)
1747
+ if utils.match_response(http_res, "404", "application/json"):
1748
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
1749
+ response_data.http_meta = models.HTTPMetadata(
1750
+ request=req, response=http_res
1751
+ )
1752
+ raise errors.NotFound(response_data, http_res)
1753
+ if utils.match_response(http_res, "500", "application/json"):
1754
+ response_data = unmarshal_json_response(
1755
+ errors.InternalServerErrorUnion, http_res
1756
+ )
1757
+ response_data.http_meta = models.HTTPMetadata(
1758
+ request=req, response=http_res
1759
+ )
1760
+ raise errors.InternalServerError(response_data, http_res)
1761
+ if utils.match_response(http_res, "4XX", "*"):
1762
+ http_res_text = utils.stream_to_text(http_res)
1763
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1764
+ if utils.match_response(http_res, "5XX", "*"):
1765
+ http_res_text = utils.stream_to_text(http_res)
1766
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1767
+
1768
+ raise errors.APIError("Unexpected response received", http_res)
1769
+
1770
+ async def get_upgrades_downgrades_async(
1771
+ self,
1772
+ *,
1773
+ symbol: Optional[str] = None,
1774
+ from_: Optional[date] = None,
1775
+ to: Optional[date] = None,
1776
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
1777
+ server_url: Optional[str] = None,
1778
+ timeout_ms: Optional[int] = None,
1779
+ http_headers: Optional[Mapping[str, str]] = None,
1780
+ ) -> models.GetUpgradesDowngradesResponse:
1781
+ r"""Get Analyst Upgrades & Downgrades
1782
+
1783
+ Retrieve analyst rating changes including upgrades, downgrades, and reiterations from investment banks and research firms.
1784
+
1785
+ If set, this operation will use `client_id` from the global security.
1786
+
1787
+ :param symbol: Stock ticker to filter by. Send the plain uppercase symbol (e.g. `AAPL`). Omit to return data across all symbols.
1788
+ :param from_: Start of the date window, inclusive. Format: `YYYY-MM-DD` (e.g. `2024-01-01`). Omit to read from the earliest available data.
1789
+ :param to: End of the date window, inclusive. Format: `YYYY-MM-DD` (e.g. `2024-12-31`). Omit to read up to today.
1790
+ :param retries: Override the default retry configuration for this method
1791
+ :param server_url: Override the default server URL for this method
1792
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
1793
+ :param http_headers: Additional headers to set or replace on requests.
1794
+ """
1795
+ base_url = None
1796
+ url_variables = None
1797
+ if timeout_ms is None:
1798
+ timeout_ms = self.sdk_configuration.timeout_ms
1799
+
1800
+ if timeout_ms is None:
1801
+ timeout_ms = 30000
1802
+
1803
+ if server_url is not None:
1804
+ base_url = server_url
1805
+ else:
1806
+ base_url = self._get_url(base_url, url_variables)
1807
+
1808
+ request = models.GetUpgradesDowngradesRequest(
1809
+ symbol=symbol,
1810
+ from_=from_,
1811
+ to=to,
1812
+ )
1813
+
1814
+ req = self._build_request_async(
1815
+ method="GET",
1816
+ path="/v1/stock/upgrade-downgrade",
1817
+ base_url=base_url,
1818
+ url_variables=url_variables,
1819
+ request=request,
1820
+ request_body_required=False,
1821
+ request_has_path_params=False,
1822
+ request_has_query_params=True,
1823
+ user_agent_header="user-agent",
1824
+ accept_header_value="application/json",
1825
+ http_headers=http_headers,
1826
+ security=self.sdk_configuration.security,
1827
+ allow_empty_value=None,
1828
+ allowed_fields=["client_id"],
1829
+ timeout_ms=timeout_ms,
1830
+ )
1831
+
1832
+ if retries == UNSET:
1833
+ if self.sdk_configuration.retry_config is not UNSET:
1834
+ retries = self.sdk_configuration.retry_config
1835
+ else:
1836
+ retries = utils.RetryConfig(
1837
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
1838
+ )
1839
+
1840
+ retry_config = None
1841
+ if isinstance(retries, utils.RetryConfig):
1842
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
1843
+
1844
+ http_res = await self.do_request_async(
1845
+ hook_ctx=HookContext(
1846
+ config=self.sdk_configuration,
1847
+ base_url=base_url or "",
1848
+ operation_id="getUpgradesDowngrades",
1849
+ oauth2_scopes=["market:supplemental"],
1850
+ security_source=self.sdk_configuration.security,
1851
+ tags=["Stock Estimates"],
1852
+ extensions=None,
1853
+ ),
1854
+ request=req,
1855
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
1856
+ retry_config=retry_config,
1857
+ )
1858
+
1859
+ response_data: Any = None
1860
+ if utils.match_response(http_res, "200", "application/json"):
1861
+ return models.GetUpgradesDowngradesResponse(
1862
+ upgrades_downgrades_response=unmarshal_json_response(
1863
+ Optional[models.UpgradesDowngradesResponse], http_res
1864
+ ),
1865
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
1866
+ )
1867
+ if utils.match_response(http_res, "400", "application/json"):
1868
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
1869
+ response_data.http_meta = models.HTTPMetadata(
1870
+ request=req, response=http_res
1871
+ )
1872
+ raise errors.BadRequest(response_data, http_res)
1873
+ if utils.match_response(http_res, "401", "application/json"):
1874
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
1875
+ response_data.http_meta = models.HTTPMetadata(
1876
+ request=req, response=http_res
1877
+ )
1878
+ raise errors.Unauthorized(response_data, http_res)
1879
+ if utils.match_response(http_res, "403", "application/json"):
1880
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
1881
+ response_data.http_meta = models.HTTPMetadata(
1882
+ request=req, response=http_res
1883
+ )
1884
+ raise errors.Forbidden(response_data, http_res)
1885
+ if utils.match_response(http_res, "404", "application/json"):
1886
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
1887
+ response_data.http_meta = models.HTTPMetadata(
1888
+ request=req, response=http_res
1889
+ )
1890
+ raise errors.NotFound(response_data, http_res)
1891
+ if utils.match_response(http_res, "500", "application/json"):
1892
+ response_data = unmarshal_json_response(
1893
+ errors.InternalServerErrorUnion, http_res
1894
+ )
1895
+ response_data.http_meta = models.HTTPMetadata(
1896
+ request=req, response=http_res
1897
+ )
1898
+ raise errors.InternalServerError(response_data, http_res)
1899
+ if utils.match_response(http_res, "4XX", "*"):
1900
+ http_res_text = await utils.stream_to_text_async(http_res)
1901
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1902
+ if utils.match_response(http_res, "5XX", "*"):
1903
+ http_res_text = await utils.stream_to_text_async(http_res)
1904
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1905
+
1906
+ raise errors.APIError("Unexpected response received", http_res)