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
finance_dev/etf.py ADDED
@@ -0,0 +1,1108 @@
1
+ """Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
2
+ # @generated-id: 5427d03748ca
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 Etf(BaseSDK):
14
+ def get_etf_country_allocation(
15
+ self,
16
+ *,
17
+ symbol: str,
18
+ isin: Optional[str] = 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.GetEtfCountryAllocationResponse:
24
+ r"""Get ETF Country Allocation
25
+
26
+ Retrieve ETF geographic allocation showing percentage exposure to different countries and regions for assessing international diversification.
27
+
28
+ If set, this operation will use `client_id` from the global security.
29
+
30
+ :param symbol: ETF ticker to query. Send the plain uppercase symbol, e.g. `SPY`, `QQQ`, `IWM`.
31
+ :param isin: ISIN identifier — the 12-character International Securities Identification Number for the instrument (e.g. `US0378331005` for Apple). Provide this instead of `symbol` when you have an ISIN.
32
+ :param retries: Override the default retry configuration for this method
33
+ :param server_url: Override the default server URL for this method
34
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
35
+ :param http_headers: Additional headers to set or replace on requests.
36
+ """
37
+ base_url = None
38
+ url_variables = None
39
+ if timeout_ms is None:
40
+ timeout_ms = self.sdk_configuration.timeout_ms
41
+
42
+ if timeout_ms is None:
43
+ timeout_ms = 30000
44
+
45
+ if server_url is not None:
46
+ base_url = server_url
47
+ else:
48
+ base_url = self._get_url(base_url, url_variables)
49
+
50
+ request = models.GetEtfCountryAllocationRequest(
51
+ symbol=symbol,
52
+ isin=isin,
53
+ )
54
+
55
+ req = self._build_request(
56
+ method="GET",
57
+ path="/v1/etf/country",
58
+ base_url=base_url,
59
+ url_variables=url_variables,
60
+ request=request,
61
+ request_body_required=False,
62
+ request_has_path_params=False,
63
+ request_has_query_params=True,
64
+ user_agent_header="user-agent",
65
+ accept_header_value="application/json",
66
+ http_headers=http_headers,
67
+ security=self.sdk_configuration.security,
68
+ allow_empty_value=None,
69
+ allowed_fields=["client_id"],
70
+ timeout_ms=timeout_ms,
71
+ )
72
+
73
+ if retries == UNSET:
74
+ if self.sdk_configuration.retry_config is not UNSET:
75
+ retries = self.sdk_configuration.retry_config
76
+ else:
77
+ retries = utils.RetryConfig(
78
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
79
+ )
80
+
81
+ retry_config = None
82
+ if isinstance(retries, utils.RetryConfig):
83
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
84
+
85
+ http_res = self.do_request(
86
+ hook_ctx=HookContext(
87
+ config=self.sdk_configuration,
88
+ base_url=base_url or "",
89
+ operation_id="getEtfCountryAllocation",
90
+ oauth2_scopes=["market:supplemental"],
91
+ security_source=self.sdk_configuration.security,
92
+ tags=["ETF"],
93
+ extensions=None,
94
+ ),
95
+ request=req,
96
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
97
+ retry_config=retry_config,
98
+ )
99
+
100
+ response_data: Any = None
101
+ if utils.match_response(http_res, "200", "application/json"):
102
+ return models.GetEtfCountryAllocationResponse(
103
+ etf_country_allocation_response=unmarshal_json_response(
104
+ Optional[models.EtfCountryAllocationResponse], http_res
105
+ ),
106
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
107
+ )
108
+ if utils.match_response(http_res, "400", "application/json"):
109
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
110
+ response_data.http_meta = models.HTTPMetadata(
111
+ request=req, response=http_res
112
+ )
113
+ raise errors.BadRequest(response_data, http_res)
114
+ if utils.match_response(http_res, "401", "application/json"):
115
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
116
+ response_data.http_meta = models.HTTPMetadata(
117
+ request=req, response=http_res
118
+ )
119
+ raise errors.Unauthorized(response_data, http_res)
120
+ if utils.match_response(http_res, "403", "application/json"):
121
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
122
+ response_data.http_meta = models.HTTPMetadata(
123
+ request=req, response=http_res
124
+ )
125
+ raise errors.Forbidden(response_data, http_res)
126
+ if utils.match_response(http_res, "404", "application/json"):
127
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
128
+ response_data.http_meta = models.HTTPMetadata(
129
+ request=req, response=http_res
130
+ )
131
+ raise errors.NotFound(response_data, http_res)
132
+ if utils.match_response(http_res, "500", "application/json"):
133
+ response_data = unmarshal_json_response(
134
+ errors.InternalServerErrorUnion, http_res
135
+ )
136
+ response_data.http_meta = models.HTTPMetadata(
137
+ request=req, response=http_res
138
+ )
139
+ raise errors.InternalServerError(response_data, http_res)
140
+ if utils.match_response(http_res, "4XX", "*"):
141
+ http_res_text = utils.stream_to_text(http_res)
142
+ raise errors.APIError("API error occurred", http_res, http_res_text)
143
+ if utils.match_response(http_res, "5XX", "*"):
144
+ http_res_text = utils.stream_to_text(http_res)
145
+ raise errors.APIError("API error occurred", http_res, http_res_text)
146
+
147
+ raise errors.APIError("Unexpected response received", http_res)
148
+
149
+ async def get_etf_country_allocation_async(
150
+ self,
151
+ *,
152
+ symbol: str,
153
+ isin: Optional[str] = None,
154
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
155
+ server_url: Optional[str] = None,
156
+ timeout_ms: Optional[int] = None,
157
+ http_headers: Optional[Mapping[str, str]] = None,
158
+ ) -> models.GetEtfCountryAllocationResponse:
159
+ r"""Get ETF Country Allocation
160
+
161
+ Retrieve ETF geographic allocation showing percentage exposure to different countries and regions for assessing international diversification.
162
+
163
+ If set, this operation will use `client_id` from the global security.
164
+
165
+ :param symbol: ETF ticker to query. Send the plain uppercase symbol, e.g. `SPY`, `QQQ`, `IWM`.
166
+ :param isin: ISIN identifier — the 12-character International Securities Identification Number for the instrument (e.g. `US0378331005` for Apple). Provide this instead of `symbol` when you have an ISIN.
167
+ :param retries: Override the default retry configuration for this method
168
+ :param server_url: Override the default server URL for this method
169
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
170
+ :param http_headers: Additional headers to set or replace on requests.
171
+ """
172
+ base_url = None
173
+ url_variables = None
174
+ if timeout_ms is None:
175
+ timeout_ms = self.sdk_configuration.timeout_ms
176
+
177
+ if timeout_ms is None:
178
+ timeout_ms = 30000
179
+
180
+ if server_url is not None:
181
+ base_url = server_url
182
+ else:
183
+ base_url = self._get_url(base_url, url_variables)
184
+
185
+ request = models.GetEtfCountryAllocationRequest(
186
+ symbol=symbol,
187
+ isin=isin,
188
+ )
189
+
190
+ req = self._build_request_async(
191
+ method="GET",
192
+ path="/v1/etf/country",
193
+ base_url=base_url,
194
+ url_variables=url_variables,
195
+ request=request,
196
+ request_body_required=False,
197
+ request_has_path_params=False,
198
+ request_has_query_params=True,
199
+ user_agent_header="user-agent",
200
+ accept_header_value="application/json",
201
+ http_headers=http_headers,
202
+ security=self.sdk_configuration.security,
203
+ allow_empty_value=None,
204
+ allowed_fields=["client_id"],
205
+ timeout_ms=timeout_ms,
206
+ )
207
+
208
+ if retries == UNSET:
209
+ if self.sdk_configuration.retry_config is not UNSET:
210
+ retries = self.sdk_configuration.retry_config
211
+ else:
212
+ retries = utils.RetryConfig(
213
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
214
+ )
215
+
216
+ retry_config = None
217
+ if isinstance(retries, utils.RetryConfig):
218
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
219
+
220
+ http_res = await self.do_request_async(
221
+ hook_ctx=HookContext(
222
+ config=self.sdk_configuration,
223
+ base_url=base_url or "",
224
+ operation_id="getEtfCountryAllocation",
225
+ oauth2_scopes=["market:supplemental"],
226
+ security_source=self.sdk_configuration.security,
227
+ tags=["ETF"],
228
+ extensions=None,
229
+ ),
230
+ request=req,
231
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
232
+ retry_config=retry_config,
233
+ )
234
+
235
+ response_data: Any = None
236
+ if utils.match_response(http_res, "200", "application/json"):
237
+ return models.GetEtfCountryAllocationResponse(
238
+ etf_country_allocation_response=unmarshal_json_response(
239
+ Optional[models.EtfCountryAllocationResponse], http_res
240
+ ),
241
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
242
+ )
243
+ if utils.match_response(http_res, "400", "application/json"):
244
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
245
+ response_data.http_meta = models.HTTPMetadata(
246
+ request=req, response=http_res
247
+ )
248
+ raise errors.BadRequest(response_data, http_res)
249
+ if utils.match_response(http_res, "401", "application/json"):
250
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
251
+ response_data.http_meta = models.HTTPMetadata(
252
+ request=req, response=http_res
253
+ )
254
+ raise errors.Unauthorized(response_data, http_res)
255
+ if utils.match_response(http_res, "403", "application/json"):
256
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
257
+ response_data.http_meta = models.HTTPMetadata(
258
+ request=req, response=http_res
259
+ )
260
+ raise errors.Forbidden(response_data, http_res)
261
+ if utils.match_response(http_res, "404", "application/json"):
262
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
263
+ response_data.http_meta = models.HTTPMetadata(
264
+ request=req, response=http_res
265
+ )
266
+ raise errors.NotFound(response_data, http_res)
267
+ if utils.match_response(http_res, "500", "application/json"):
268
+ response_data = unmarshal_json_response(
269
+ errors.InternalServerErrorUnion, http_res
270
+ )
271
+ response_data.http_meta = models.HTTPMetadata(
272
+ request=req, response=http_res
273
+ )
274
+ raise errors.InternalServerError(response_data, http_res)
275
+ if utils.match_response(http_res, "4XX", "*"):
276
+ http_res_text = await utils.stream_to_text_async(http_res)
277
+ raise errors.APIError("API error occurred", http_res, http_res_text)
278
+ if utils.match_response(http_res, "5XX", "*"):
279
+ http_res_text = await utils.stream_to_text_async(http_res)
280
+ raise errors.APIError("API error occurred", http_res, http_res_text)
281
+
282
+ raise errors.APIError("Unexpected response received", http_res)
283
+
284
+ def get_etf_holdings(
285
+ self,
286
+ *,
287
+ symbol: Optional[str] = None,
288
+ isin: Optional[str] = None,
289
+ skip: Optional[int] = None,
290
+ date_: Optional[date] = None,
291
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
292
+ server_url: Optional[str] = None,
293
+ timeout_ms: Optional[int] = None,
294
+ http_headers: Optional[Mapping[str, str]] = None,
295
+ ) -> models.GetEtfHoldingsResponse:
296
+ r"""Get ETF Holdings
297
+
298
+ Retrieve detailed ETF holdings showing constituent securities, allocation percentages, share quantities, and market values.
299
+
300
+ If `skip` cannot be parsed as a signed 64-bit integer, returns 400 Bad Request with error code `INVALID_PARAMETER` and message `invalid skip parameter`.
301
+
302
+ If set, this operation will use `client_id` from the global security.
303
+
304
+ :param symbol: ETF ticker to filter by. Send the plain uppercase symbol (e.g. `SPY`). Provide either `symbol` or `isin`.
305
+ :param isin: ISIN identifier — the 12-character International Securities Identification Number for the instrument (e.g. `US0378331005` for Apple). Provide this instead of `symbol` when you have an ISIN.
306
+ :param skip: (Optional) Number of records to skip for pagination
307
+ :param date_: (Optional) Date for historical holdings (YYYY-MM-DD)
308
+ :param retries: Override the default retry configuration for this method
309
+ :param server_url: Override the default server URL for this method
310
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
311
+ :param http_headers: Additional headers to set or replace on requests.
312
+ """
313
+ base_url = None
314
+ url_variables = None
315
+ if timeout_ms is None:
316
+ timeout_ms = self.sdk_configuration.timeout_ms
317
+
318
+ if timeout_ms is None:
319
+ timeout_ms = 30000
320
+
321
+ if server_url is not None:
322
+ base_url = server_url
323
+ else:
324
+ base_url = self._get_url(base_url, url_variables)
325
+
326
+ request = models.GetEtfHoldingsRequest(
327
+ symbol=symbol,
328
+ isin=isin,
329
+ skip=skip,
330
+ date_=date_,
331
+ )
332
+
333
+ req = self._build_request(
334
+ method="GET",
335
+ path="/v1/etf/holdings",
336
+ base_url=base_url,
337
+ url_variables=url_variables,
338
+ request=request,
339
+ request_body_required=False,
340
+ request_has_path_params=False,
341
+ request_has_query_params=True,
342
+ user_agent_header="user-agent",
343
+ accept_header_value="application/json",
344
+ http_headers=http_headers,
345
+ security=self.sdk_configuration.security,
346
+ allow_empty_value=None,
347
+ allowed_fields=["client_id"],
348
+ timeout_ms=timeout_ms,
349
+ )
350
+
351
+ if retries == UNSET:
352
+ if self.sdk_configuration.retry_config is not UNSET:
353
+ retries = self.sdk_configuration.retry_config
354
+ else:
355
+ retries = utils.RetryConfig(
356
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
357
+ )
358
+
359
+ retry_config = None
360
+ if isinstance(retries, utils.RetryConfig):
361
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
362
+
363
+ http_res = self.do_request(
364
+ hook_ctx=HookContext(
365
+ config=self.sdk_configuration,
366
+ base_url=base_url or "",
367
+ operation_id="getEtfHoldings",
368
+ oauth2_scopes=["market:supplemental"],
369
+ security_source=self.sdk_configuration.security,
370
+ tags=["ETF"],
371
+ extensions=None,
372
+ ),
373
+ request=req,
374
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
375
+ retry_config=retry_config,
376
+ )
377
+
378
+ response_data: Any = None
379
+ if utils.match_response(http_res, "200", "application/json"):
380
+ return models.GetEtfHoldingsResponse(
381
+ etf_holdings_response=unmarshal_json_response(
382
+ Optional[models.EtfHoldingsResponse], http_res
383
+ ),
384
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
385
+ )
386
+ if utils.match_response(http_res, "400", "application/json"):
387
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
388
+ response_data.http_meta = models.HTTPMetadata(
389
+ request=req, response=http_res
390
+ )
391
+ raise errors.BadRequest(response_data, http_res)
392
+ if utils.match_response(http_res, "401", "application/json"):
393
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
394
+ response_data.http_meta = models.HTTPMetadata(
395
+ request=req, response=http_res
396
+ )
397
+ raise errors.Unauthorized(response_data, http_res)
398
+ if utils.match_response(http_res, "403", "application/json"):
399
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
400
+ response_data.http_meta = models.HTTPMetadata(
401
+ request=req, response=http_res
402
+ )
403
+ raise errors.Forbidden(response_data, http_res)
404
+ if utils.match_response(http_res, "404", "application/json"):
405
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
406
+ response_data.http_meta = models.HTTPMetadata(
407
+ request=req, response=http_res
408
+ )
409
+ raise errors.NotFound(response_data, http_res)
410
+ if utils.match_response(http_res, "500", "application/json"):
411
+ response_data = unmarshal_json_response(
412
+ errors.InternalServerErrorUnion, http_res
413
+ )
414
+ response_data.http_meta = models.HTTPMetadata(
415
+ request=req, response=http_res
416
+ )
417
+ raise errors.InternalServerError(response_data, http_res)
418
+ if utils.match_response(http_res, "4XX", "*"):
419
+ http_res_text = utils.stream_to_text(http_res)
420
+ raise errors.APIError("API error occurred", http_res, http_res_text)
421
+ if utils.match_response(http_res, "5XX", "*"):
422
+ http_res_text = utils.stream_to_text(http_res)
423
+ raise errors.APIError("API error occurred", http_res, http_res_text)
424
+
425
+ raise errors.APIError("Unexpected response received", http_res)
426
+
427
+ async def get_etf_holdings_async(
428
+ self,
429
+ *,
430
+ symbol: Optional[str] = None,
431
+ isin: Optional[str] = None,
432
+ skip: Optional[int] = None,
433
+ date_: Optional[date] = None,
434
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
435
+ server_url: Optional[str] = None,
436
+ timeout_ms: Optional[int] = None,
437
+ http_headers: Optional[Mapping[str, str]] = None,
438
+ ) -> models.GetEtfHoldingsResponse:
439
+ r"""Get ETF Holdings
440
+
441
+ Retrieve detailed ETF holdings showing constituent securities, allocation percentages, share quantities, and market values.
442
+
443
+ If `skip` cannot be parsed as a signed 64-bit integer, returns 400 Bad Request with error code `INVALID_PARAMETER` and message `invalid skip parameter`.
444
+
445
+ If set, this operation will use `client_id` from the global security.
446
+
447
+ :param symbol: ETF ticker to filter by. Send the plain uppercase symbol (e.g. `SPY`). Provide either `symbol` or `isin`.
448
+ :param isin: ISIN identifier — the 12-character International Securities Identification Number for the instrument (e.g. `US0378331005` for Apple). Provide this instead of `symbol` when you have an ISIN.
449
+ :param skip: (Optional) Number of records to skip for pagination
450
+ :param date_: (Optional) Date for historical holdings (YYYY-MM-DD)
451
+ :param retries: Override the default retry configuration for this method
452
+ :param server_url: Override the default server URL for this method
453
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
454
+ :param http_headers: Additional headers to set or replace on requests.
455
+ """
456
+ base_url = None
457
+ url_variables = None
458
+ if timeout_ms is None:
459
+ timeout_ms = self.sdk_configuration.timeout_ms
460
+
461
+ if timeout_ms is None:
462
+ timeout_ms = 30000
463
+
464
+ if server_url is not None:
465
+ base_url = server_url
466
+ else:
467
+ base_url = self._get_url(base_url, url_variables)
468
+
469
+ request = models.GetEtfHoldingsRequest(
470
+ symbol=symbol,
471
+ isin=isin,
472
+ skip=skip,
473
+ date_=date_,
474
+ )
475
+
476
+ req = self._build_request_async(
477
+ method="GET",
478
+ path="/v1/etf/holdings",
479
+ base_url=base_url,
480
+ url_variables=url_variables,
481
+ request=request,
482
+ request_body_required=False,
483
+ request_has_path_params=False,
484
+ request_has_query_params=True,
485
+ user_agent_header="user-agent",
486
+ accept_header_value="application/json",
487
+ http_headers=http_headers,
488
+ security=self.sdk_configuration.security,
489
+ allow_empty_value=None,
490
+ allowed_fields=["client_id"],
491
+ timeout_ms=timeout_ms,
492
+ )
493
+
494
+ if retries == UNSET:
495
+ if self.sdk_configuration.retry_config is not UNSET:
496
+ retries = self.sdk_configuration.retry_config
497
+ else:
498
+ retries = utils.RetryConfig(
499
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
500
+ )
501
+
502
+ retry_config = None
503
+ if isinstance(retries, utils.RetryConfig):
504
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
505
+
506
+ http_res = await self.do_request_async(
507
+ hook_ctx=HookContext(
508
+ config=self.sdk_configuration,
509
+ base_url=base_url or "",
510
+ operation_id="getEtfHoldings",
511
+ oauth2_scopes=["market:supplemental"],
512
+ security_source=self.sdk_configuration.security,
513
+ tags=["ETF"],
514
+ extensions=None,
515
+ ),
516
+ request=req,
517
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
518
+ retry_config=retry_config,
519
+ )
520
+
521
+ response_data: Any = None
522
+ if utils.match_response(http_res, "200", "application/json"):
523
+ return models.GetEtfHoldingsResponse(
524
+ etf_holdings_response=unmarshal_json_response(
525
+ Optional[models.EtfHoldingsResponse], http_res
526
+ ),
527
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
528
+ )
529
+ if utils.match_response(http_res, "400", "application/json"):
530
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
531
+ response_data.http_meta = models.HTTPMetadata(
532
+ request=req, response=http_res
533
+ )
534
+ raise errors.BadRequest(response_data, http_res)
535
+ if utils.match_response(http_res, "401", "application/json"):
536
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
537
+ response_data.http_meta = models.HTTPMetadata(
538
+ request=req, response=http_res
539
+ )
540
+ raise errors.Unauthorized(response_data, http_res)
541
+ if utils.match_response(http_res, "403", "application/json"):
542
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
543
+ response_data.http_meta = models.HTTPMetadata(
544
+ request=req, response=http_res
545
+ )
546
+ raise errors.Forbidden(response_data, http_res)
547
+ if utils.match_response(http_res, "404", "application/json"):
548
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
549
+ response_data.http_meta = models.HTTPMetadata(
550
+ request=req, response=http_res
551
+ )
552
+ raise errors.NotFound(response_data, http_res)
553
+ if utils.match_response(http_res, "500", "application/json"):
554
+ response_data = unmarshal_json_response(
555
+ errors.InternalServerErrorUnion, http_res
556
+ )
557
+ response_data.http_meta = models.HTTPMetadata(
558
+ request=req, response=http_res
559
+ )
560
+ raise errors.InternalServerError(response_data, http_res)
561
+ if utils.match_response(http_res, "4XX", "*"):
562
+ http_res_text = await utils.stream_to_text_async(http_res)
563
+ raise errors.APIError("API error occurred", http_res, http_res_text)
564
+ if utils.match_response(http_res, "5XX", "*"):
565
+ http_res_text = await utils.stream_to_text_async(http_res)
566
+ raise errors.APIError("API error occurred", http_res, http_res_text)
567
+
568
+ raise errors.APIError("Unexpected response received", http_res)
569
+
570
+ def get_etf_profile(
571
+ self,
572
+ *,
573
+ symbol: str,
574
+ isin: Optional[str] = None,
575
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
576
+ server_url: Optional[str] = None,
577
+ timeout_ms: Optional[int] = None,
578
+ http_headers: Optional[Mapping[str, str]] = None,
579
+ ) -> models.GetEtfProfileResponse:
580
+ r"""Get ETF Profile
581
+
582
+ Retrieve comprehensive ETF information including fund name, description, expense ratio, assets under management, and tracking methodology.
583
+
584
+ If set, this operation will use `client_id` from the global security.
585
+
586
+ :param symbol: ETF ticker symbol (e.g. SPY, QQQ, VTI)
587
+ :param isin: ISIN identifier — the 12-character International Securities Identification Number for the instrument (e.g. `US0378331005` for Apple). Provide this instead of `symbol` when you have an ISIN.
588
+ :param retries: Override the default retry configuration for this method
589
+ :param server_url: Override the default server URL for this method
590
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
591
+ :param http_headers: Additional headers to set or replace on requests.
592
+ """
593
+ base_url = None
594
+ url_variables = None
595
+ if timeout_ms is None:
596
+ timeout_ms = self.sdk_configuration.timeout_ms
597
+
598
+ if timeout_ms is None:
599
+ timeout_ms = 30000
600
+
601
+ if server_url is not None:
602
+ base_url = server_url
603
+ else:
604
+ base_url = self._get_url(base_url, url_variables)
605
+
606
+ request = models.GetEtfProfileRequest(
607
+ symbol=symbol,
608
+ isin=isin,
609
+ )
610
+
611
+ req = self._build_request(
612
+ method="GET",
613
+ path="/v1/etf/profile",
614
+ base_url=base_url,
615
+ url_variables=url_variables,
616
+ request=request,
617
+ request_body_required=False,
618
+ request_has_path_params=False,
619
+ request_has_query_params=True,
620
+ user_agent_header="user-agent",
621
+ accept_header_value="application/json",
622
+ http_headers=http_headers,
623
+ security=self.sdk_configuration.security,
624
+ allow_empty_value=None,
625
+ allowed_fields=["client_id"],
626
+ timeout_ms=timeout_ms,
627
+ )
628
+
629
+ if retries == UNSET:
630
+ if self.sdk_configuration.retry_config is not UNSET:
631
+ retries = self.sdk_configuration.retry_config
632
+ else:
633
+ retries = utils.RetryConfig(
634
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
635
+ )
636
+
637
+ retry_config = None
638
+ if isinstance(retries, utils.RetryConfig):
639
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
640
+
641
+ http_res = self.do_request(
642
+ hook_ctx=HookContext(
643
+ config=self.sdk_configuration,
644
+ base_url=base_url or "",
645
+ operation_id="getEtfProfile",
646
+ oauth2_scopes=["market:supplemental"],
647
+ security_source=self.sdk_configuration.security,
648
+ tags=["ETF"],
649
+ extensions=None,
650
+ ),
651
+ request=req,
652
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
653
+ retry_config=retry_config,
654
+ )
655
+
656
+ response_data: Any = None
657
+ if utils.match_response(http_res, "200", "application/json"):
658
+ return models.GetEtfProfileResponse(
659
+ etf_profile_response=unmarshal_json_response(
660
+ Optional[models.EtfProfileResponse], http_res
661
+ ),
662
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
663
+ )
664
+ if utils.match_response(http_res, "400", "application/json"):
665
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
666
+ response_data.http_meta = models.HTTPMetadata(
667
+ request=req, response=http_res
668
+ )
669
+ raise errors.BadRequest(response_data, http_res)
670
+ if utils.match_response(http_res, "401", "application/json"):
671
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
672
+ response_data.http_meta = models.HTTPMetadata(
673
+ request=req, response=http_res
674
+ )
675
+ raise errors.Unauthorized(response_data, http_res)
676
+ if utils.match_response(http_res, "403", "application/json"):
677
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
678
+ response_data.http_meta = models.HTTPMetadata(
679
+ request=req, response=http_res
680
+ )
681
+ raise errors.Forbidden(response_data, http_res)
682
+ if utils.match_response(http_res, "404", "application/json"):
683
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
684
+ response_data.http_meta = models.HTTPMetadata(
685
+ request=req, response=http_res
686
+ )
687
+ raise errors.NotFound(response_data, http_res)
688
+ if utils.match_response(http_res, "500", "application/json"):
689
+ response_data = unmarshal_json_response(
690
+ errors.InternalServerErrorUnion, http_res
691
+ )
692
+ response_data.http_meta = models.HTTPMetadata(
693
+ request=req, response=http_res
694
+ )
695
+ raise errors.InternalServerError(response_data, http_res)
696
+ if utils.match_response(http_res, "4XX", "*"):
697
+ http_res_text = utils.stream_to_text(http_res)
698
+ raise errors.APIError("API error occurred", http_res, http_res_text)
699
+ if utils.match_response(http_res, "5XX", "*"):
700
+ http_res_text = utils.stream_to_text(http_res)
701
+ raise errors.APIError("API error occurred", http_res, http_res_text)
702
+
703
+ raise errors.APIError("Unexpected response received", http_res)
704
+
705
+ async def get_etf_profile_async(
706
+ self,
707
+ *,
708
+ symbol: str,
709
+ isin: Optional[str] = None,
710
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
711
+ server_url: Optional[str] = None,
712
+ timeout_ms: Optional[int] = None,
713
+ http_headers: Optional[Mapping[str, str]] = None,
714
+ ) -> models.GetEtfProfileResponse:
715
+ r"""Get ETF Profile
716
+
717
+ Retrieve comprehensive ETF information including fund name, description, expense ratio, assets under management, and tracking methodology.
718
+
719
+ If set, this operation will use `client_id` from the global security.
720
+
721
+ :param symbol: ETF ticker symbol (e.g. SPY, QQQ, VTI)
722
+ :param isin: ISIN identifier — the 12-character International Securities Identification Number for the instrument (e.g. `US0378331005` for Apple). Provide this instead of `symbol` when you have an ISIN.
723
+ :param retries: Override the default retry configuration for this method
724
+ :param server_url: Override the default server URL for this method
725
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
726
+ :param http_headers: Additional headers to set or replace on requests.
727
+ """
728
+ base_url = None
729
+ url_variables = None
730
+ if timeout_ms is None:
731
+ timeout_ms = self.sdk_configuration.timeout_ms
732
+
733
+ if timeout_ms is None:
734
+ timeout_ms = 30000
735
+
736
+ if server_url is not None:
737
+ base_url = server_url
738
+ else:
739
+ base_url = self._get_url(base_url, url_variables)
740
+
741
+ request = models.GetEtfProfileRequest(
742
+ symbol=symbol,
743
+ isin=isin,
744
+ )
745
+
746
+ req = self._build_request_async(
747
+ method="GET",
748
+ path="/v1/etf/profile",
749
+ base_url=base_url,
750
+ url_variables=url_variables,
751
+ request=request,
752
+ request_body_required=False,
753
+ request_has_path_params=False,
754
+ request_has_query_params=True,
755
+ user_agent_header="user-agent",
756
+ accept_header_value="application/json",
757
+ http_headers=http_headers,
758
+ security=self.sdk_configuration.security,
759
+ allow_empty_value=None,
760
+ allowed_fields=["client_id"],
761
+ timeout_ms=timeout_ms,
762
+ )
763
+
764
+ if retries == UNSET:
765
+ if self.sdk_configuration.retry_config is not UNSET:
766
+ retries = self.sdk_configuration.retry_config
767
+ else:
768
+ retries = utils.RetryConfig(
769
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
770
+ )
771
+
772
+ retry_config = None
773
+ if isinstance(retries, utils.RetryConfig):
774
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
775
+
776
+ http_res = await self.do_request_async(
777
+ hook_ctx=HookContext(
778
+ config=self.sdk_configuration,
779
+ base_url=base_url or "",
780
+ operation_id="getEtfProfile",
781
+ oauth2_scopes=["market:supplemental"],
782
+ security_source=self.sdk_configuration.security,
783
+ tags=["ETF"],
784
+ extensions=None,
785
+ ),
786
+ request=req,
787
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
788
+ retry_config=retry_config,
789
+ )
790
+
791
+ response_data: Any = None
792
+ if utils.match_response(http_res, "200", "application/json"):
793
+ return models.GetEtfProfileResponse(
794
+ etf_profile_response=unmarshal_json_response(
795
+ Optional[models.EtfProfileResponse], http_res
796
+ ),
797
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
798
+ )
799
+ if utils.match_response(http_res, "400", "application/json"):
800
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
801
+ response_data.http_meta = models.HTTPMetadata(
802
+ request=req, response=http_res
803
+ )
804
+ raise errors.BadRequest(response_data, http_res)
805
+ if utils.match_response(http_res, "401", "application/json"):
806
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
807
+ response_data.http_meta = models.HTTPMetadata(
808
+ request=req, response=http_res
809
+ )
810
+ raise errors.Unauthorized(response_data, http_res)
811
+ if utils.match_response(http_res, "403", "application/json"):
812
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
813
+ response_data.http_meta = models.HTTPMetadata(
814
+ request=req, response=http_res
815
+ )
816
+ raise errors.Forbidden(response_data, http_res)
817
+ if utils.match_response(http_res, "404", "application/json"):
818
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
819
+ response_data.http_meta = models.HTTPMetadata(
820
+ request=req, response=http_res
821
+ )
822
+ raise errors.NotFound(response_data, http_res)
823
+ if utils.match_response(http_res, "500", "application/json"):
824
+ response_data = unmarshal_json_response(
825
+ errors.InternalServerErrorUnion, http_res
826
+ )
827
+ response_data.http_meta = models.HTTPMetadata(
828
+ request=req, response=http_res
829
+ )
830
+ raise errors.InternalServerError(response_data, http_res)
831
+ if utils.match_response(http_res, "4XX", "*"):
832
+ http_res_text = await utils.stream_to_text_async(http_res)
833
+ raise errors.APIError("API error occurred", http_res, http_res_text)
834
+ if utils.match_response(http_res, "5XX", "*"):
835
+ http_res_text = await utils.stream_to_text_async(http_res)
836
+ raise errors.APIError("API error occurred", http_res, http_res_text)
837
+
838
+ raise errors.APIError("Unexpected response received", http_res)
839
+
840
+ def get_etf_sector_allocation(
841
+ self,
842
+ *,
843
+ symbol: str,
844
+ isin: Optional[str] = None,
845
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
846
+ server_url: Optional[str] = None,
847
+ timeout_ms: Optional[int] = None,
848
+ http_headers: Optional[Mapping[str, str]] = None,
849
+ ) -> models.GetEtfSectorAllocationResponse:
850
+ r"""Get ETF Sector Allocation
851
+
852
+ Retrieve ETF sector allocation breakdown showing percentage exposure to different industries such as technology, healthcare, and financials.
853
+
854
+ If set, this operation will use `client_id` from the global security.
855
+
856
+ :param symbol: ETF ticker to query. Send the plain uppercase symbol, e.g. `SPY`, `QQQ`, `IWM`.
857
+ :param isin: ISIN identifier — the 12-character International Securities Identification Number for the instrument (e.g. `US0378331005` for Apple). Provide this instead of `symbol` when you have an ISIN.
858
+ :param retries: Override the default retry configuration for this method
859
+ :param server_url: Override the default server URL for this method
860
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
861
+ :param http_headers: Additional headers to set or replace on requests.
862
+ """
863
+ base_url = None
864
+ url_variables = None
865
+ if timeout_ms is None:
866
+ timeout_ms = self.sdk_configuration.timeout_ms
867
+
868
+ if timeout_ms is None:
869
+ timeout_ms = 30000
870
+
871
+ if server_url is not None:
872
+ base_url = server_url
873
+ else:
874
+ base_url = self._get_url(base_url, url_variables)
875
+
876
+ request = models.GetEtfSectorAllocationRequest(
877
+ symbol=symbol,
878
+ isin=isin,
879
+ )
880
+
881
+ req = self._build_request(
882
+ method="GET",
883
+ path="/v1/etf/sector",
884
+ base_url=base_url,
885
+ url_variables=url_variables,
886
+ request=request,
887
+ request_body_required=False,
888
+ request_has_path_params=False,
889
+ request_has_query_params=True,
890
+ user_agent_header="user-agent",
891
+ accept_header_value="application/json",
892
+ http_headers=http_headers,
893
+ security=self.sdk_configuration.security,
894
+ allow_empty_value=None,
895
+ allowed_fields=["client_id"],
896
+ timeout_ms=timeout_ms,
897
+ )
898
+
899
+ if retries == UNSET:
900
+ if self.sdk_configuration.retry_config is not UNSET:
901
+ retries = self.sdk_configuration.retry_config
902
+ else:
903
+ retries = utils.RetryConfig(
904
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
905
+ )
906
+
907
+ retry_config = None
908
+ if isinstance(retries, utils.RetryConfig):
909
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
910
+
911
+ http_res = self.do_request(
912
+ hook_ctx=HookContext(
913
+ config=self.sdk_configuration,
914
+ base_url=base_url or "",
915
+ operation_id="getEtfSectorAllocation",
916
+ oauth2_scopes=["market:supplemental"],
917
+ security_source=self.sdk_configuration.security,
918
+ tags=["ETF"],
919
+ extensions=None,
920
+ ),
921
+ request=req,
922
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
923
+ retry_config=retry_config,
924
+ )
925
+
926
+ response_data: Any = None
927
+ if utils.match_response(http_res, "200", "application/json"):
928
+ return models.GetEtfSectorAllocationResponse(
929
+ etf_sector_allocation_response=unmarshal_json_response(
930
+ Optional[models.EtfSectorAllocationResponse], http_res
931
+ ),
932
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
933
+ )
934
+ if utils.match_response(http_res, "400", "application/json"):
935
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
936
+ response_data.http_meta = models.HTTPMetadata(
937
+ request=req, response=http_res
938
+ )
939
+ raise errors.BadRequest(response_data, http_res)
940
+ if utils.match_response(http_res, "401", "application/json"):
941
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
942
+ response_data.http_meta = models.HTTPMetadata(
943
+ request=req, response=http_res
944
+ )
945
+ raise errors.Unauthorized(response_data, http_res)
946
+ if utils.match_response(http_res, "403", "application/json"):
947
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
948
+ response_data.http_meta = models.HTTPMetadata(
949
+ request=req, response=http_res
950
+ )
951
+ raise errors.Forbidden(response_data, http_res)
952
+ if utils.match_response(http_res, "404", "application/json"):
953
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
954
+ response_data.http_meta = models.HTTPMetadata(
955
+ request=req, response=http_res
956
+ )
957
+ raise errors.NotFound(response_data, http_res)
958
+ if utils.match_response(http_res, "500", "application/json"):
959
+ response_data = unmarshal_json_response(
960
+ errors.InternalServerErrorUnion, http_res
961
+ )
962
+ response_data.http_meta = models.HTTPMetadata(
963
+ request=req, response=http_res
964
+ )
965
+ raise errors.InternalServerError(response_data, http_res)
966
+ if utils.match_response(http_res, "4XX", "*"):
967
+ http_res_text = utils.stream_to_text(http_res)
968
+ raise errors.APIError("API error occurred", http_res, http_res_text)
969
+ if utils.match_response(http_res, "5XX", "*"):
970
+ http_res_text = utils.stream_to_text(http_res)
971
+ raise errors.APIError("API error occurred", http_res, http_res_text)
972
+
973
+ raise errors.APIError("Unexpected response received", http_res)
974
+
975
+ async def get_etf_sector_allocation_async(
976
+ self,
977
+ *,
978
+ symbol: str,
979
+ isin: Optional[str] = None,
980
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
981
+ server_url: Optional[str] = None,
982
+ timeout_ms: Optional[int] = None,
983
+ http_headers: Optional[Mapping[str, str]] = None,
984
+ ) -> models.GetEtfSectorAllocationResponse:
985
+ r"""Get ETF Sector Allocation
986
+
987
+ Retrieve ETF sector allocation breakdown showing percentage exposure to different industries such as technology, healthcare, and financials.
988
+
989
+ If set, this operation will use `client_id` from the global security.
990
+
991
+ :param symbol: ETF ticker to query. Send the plain uppercase symbol, e.g. `SPY`, `QQQ`, `IWM`.
992
+ :param isin: ISIN identifier — the 12-character International Securities Identification Number for the instrument (e.g. `US0378331005` for Apple). Provide this instead of `symbol` when you have an ISIN.
993
+ :param retries: Override the default retry configuration for this method
994
+ :param server_url: Override the default server URL for this method
995
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
996
+ :param http_headers: Additional headers to set or replace on requests.
997
+ """
998
+ base_url = None
999
+ url_variables = None
1000
+ if timeout_ms is None:
1001
+ timeout_ms = self.sdk_configuration.timeout_ms
1002
+
1003
+ if timeout_ms is None:
1004
+ timeout_ms = 30000
1005
+
1006
+ if server_url is not None:
1007
+ base_url = server_url
1008
+ else:
1009
+ base_url = self._get_url(base_url, url_variables)
1010
+
1011
+ request = models.GetEtfSectorAllocationRequest(
1012
+ symbol=symbol,
1013
+ isin=isin,
1014
+ )
1015
+
1016
+ req = self._build_request_async(
1017
+ method="GET",
1018
+ path="/v1/etf/sector",
1019
+ base_url=base_url,
1020
+ url_variables=url_variables,
1021
+ request=request,
1022
+ request_body_required=False,
1023
+ request_has_path_params=False,
1024
+ request_has_query_params=True,
1025
+ user_agent_header="user-agent",
1026
+ accept_header_value="application/json",
1027
+ http_headers=http_headers,
1028
+ security=self.sdk_configuration.security,
1029
+ allow_empty_value=None,
1030
+ allowed_fields=["client_id"],
1031
+ timeout_ms=timeout_ms,
1032
+ )
1033
+
1034
+ if retries == UNSET:
1035
+ if self.sdk_configuration.retry_config is not UNSET:
1036
+ retries = self.sdk_configuration.retry_config
1037
+ else:
1038
+ retries = utils.RetryConfig(
1039
+ "backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
1040
+ )
1041
+
1042
+ retry_config = None
1043
+ if isinstance(retries, utils.RetryConfig):
1044
+ retry_config = (retries, ["429", "500", "502", "503", "504"])
1045
+
1046
+ http_res = await self.do_request_async(
1047
+ hook_ctx=HookContext(
1048
+ config=self.sdk_configuration,
1049
+ base_url=base_url or "",
1050
+ operation_id="getEtfSectorAllocation",
1051
+ oauth2_scopes=["market:supplemental"],
1052
+ security_source=self.sdk_configuration.security,
1053
+ tags=["ETF"],
1054
+ extensions=None,
1055
+ ),
1056
+ request=req,
1057
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
1058
+ retry_config=retry_config,
1059
+ )
1060
+
1061
+ response_data: Any = None
1062
+ if utils.match_response(http_res, "200", "application/json"):
1063
+ return models.GetEtfSectorAllocationResponse(
1064
+ etf_sector_allocation_response=unmarshal_json_response(
1065
+ Optional[models.EtfSectorAllocationResponse], http_res
1066
+ ),
1067
+ http_meta=models.HTTPMetadata(request=req, response=http_res),
1068
+ )
1069
+ if utils.match_response(http_res, "400", "application/json"):
1070
+ response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
1071
+ response_data.http_meta = models.HTTPMetadata(
1072
+ request=req, response=http_res
1073
+ )
1074
+ raise errors.BadRequest(response_data, http_res)
1075
+ if utils.match_response(http_res, "401", "application/json"):
1076
+ response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
1077
+ response_data.http_meta = models.HTTPMetadata(
1078
+ request=req, response=http_res
1079
+ )
1080
+ raise errors.Unauthorized(response_data, http_res)
1081
+ if utils.match_response(http_res, "403", "application/json"):
1082
+ response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
1083
+ response_data.http_meta = models.HTTPMetadata(
1084
+ request=req, response=http_res
1085
+ )
1086
+ raise errors.Forbidden(response_data, http_res)
1087
+ if utils.match_response(http_res, "404", "application/json"):
1088
+ response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
1089
+ response_data.http_meta = models.HTTPMetadata(
1090
+ request=req, response=http_res
1091
+ )
1092
+ raise errors.NotFound(response_data, http_res)
1093
+ if utils.match_response(http_res, "500", "application/json"):
1094
+ response_data = unmarshal_json_response(
1095
+ errors.InternalServerErrorUnion, http_res
1096
+ )
1097
+ response_data.http_meta = models.HTTPMetadata(
1098
+ request=req, response=http_res
1099
+ )
1100
+ raise errors.InternalServerError(response_data, http_res)
1101
+ if utils.match_response(http_res, "4XX", "*"):
1102
+ http_res_text = await utils.stream_to_text_async(http_res)
1103
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1104
+ if utils.match_response(http_res, "5XX", "*"):
1105
+ http_res_text = await utils.stream_to_text_async(http_res)
1106
+ raise errors.APIError("API error occurred", http_res, http_res_text)
1107
+
1108
+ raise errors.APIError("Unexpected response received", http_res)