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.
- finance_dev/__init__.py +18 -0
- finance_dev/_hooks/__init__.py +7 -0
- finance_dev/_hooks/clientcredentials.py +319 -0
- finance_dev/_hooks/oauth2scopes.py +50 -0
- finance_dev/_hooks/registration.py +13 -0
- finance_dev/_hooks/sdkhooks.py +82 -0
- finance_dev/_hooks/types.py +125 -0
- finance_dev/_version.py +16 -0
- finance_dev/accounts.py +797 -0
- finance_dev/alternativedata.py +4830 -0
- finance_dev/analytics.py +3757 -0
- finance_dev/basesdk.py +393 -0
- finance_dev/calendar.py +1523 -0
- finance_dev/chart.py +1881 -0
- finance_dev/company.py +1105 -0
- finance_dev/corporateactions.py +1795 -0
- finance_dev/economy.py +1153 -0
- finance_dev/errors/__init__.py +94 -0
- finance_dev/errors/apierror.py +41 -0
- finance_dev/errors/authenticationerrorenvelope.py +43 -0
- finance_dev/errors/badrequest.py +34 -0
- finance_dev/errors/errorenvelope.py +42 -0
- finance_dev/errors/errorresponse.py +45 -0
- finance_dev/errors/financedevapierror.py +31 -0
- finance_dev/errors/forbidden.py +34 -0
- finance_dev/errors/internalservererror.py +35 -0
- finance_dev/errors/no_response_error.py +18 -0
- finance_dev/errors/notfound.py +34 -0
- finance_dev/errors/orderhistorybadrequest.py +35 -0
- finance_dev/errors/predorderserrorenvelope.py +42 -0
- finance_dev/errors/responsevalidationerror.py +28 -0
- finance_dev/errors/unauthorized.py +34 -0
- finance_dev/estimates.py +1906 -0
- finance_dev/etf.py +1108 -0
- finance_dev/filings.py +586 -0
- finance_dev/financials.py +4079 -0
- finance_dev/history.py +477 -0
- finance_dev/httpclient.py +126 -0
- finance_dev/indices.py +2308 -0
- finance_dev/logos.py +692 -0
- finance_dev/market.py +1825 -0
- finance_dev/markets.py +952 -0
- finance_dev/models/__init__.py +4568 -0
- finance_dev/models/accountbalancev2.py +340 -0
- finance_dev/models/accountitem.py +78 -0
- finance_dev/models/accountposition.py +147 -0
- finance_dev/models/aggregatetechnicalindicatorsresponse.py +192 -0
- finance_dev/models/analystinsightitem.py +161 -0
- finance_dev/models/analystinsightsresponse.py +39 -0
- finance_dev/models/apperror.py +123 -0
- finance_dev/models/authenticationerrordetail.py +58 -0
- finance_dev/models/bankbranchesresponse.py +96 -0
- finance_dev/models/basicfinancials.py +243 -0
- finance_dev/models/bullbearanalysisresponse.py +150 -0
- finance_dev/models/cancelorderop.py +40 -0
- finance_dev/models/cancelordrequest_union.py +287 -0
- finance_dev/models/cancelordresponse.py +115 -0
- finance_dev/models/cashflowstatement.py +290 -0
- finance_dev/models/cashflowstatementsresponse.py +61 -0
- finance_dev/models/chartbars.py +111 -0
- finance_dev/models/chartconfig.py +81 -0
- finance_dev/models/chartresolution.py +46 -0
- finance_dev/models/companyesgresponse.py +408 -0
- finance_dev/models/companyexecutive.py +70 -0
- finance_dev/models/companyexecutiveresponse.py +39 -0
- finance_dev/models/companypeersresponse.py +38 -0
- finance_dev/models/companypresentationresponse.py +96 -0
- finance_dev/models/companyprofile.py +255 -0
- finance_dev/models/conferencecallsresponse.py +169 -0
- finance_dev/models/congressionaltradingresponse.py +138 -0
- finance_dev/models/covid19uscasesresponse.py +79 -0
- finance_dev/models/createconfigwatchlistop.py +40 -0
- finance_dev/models/createwatchlistrequest.py +43 -0
- finance_dev/models/dailymarketsummaryresponse.py +73 -0
- finance_dev/models/deleteconfigwatchlistbyidop.py +53 -0
- finance_dev/models/dividenditem.py +125 -0
- finance_dev/models/dividendsresponse.py +61 -0
- finance_dev/models/earningrelease.py +291 -0
- finance_dev/models/earningscallliveresponse.py +103 -0
- finance_dev/models/earningsqualityscoreresponse.py +140 -0
- finance_dev/models/earningssurprisesresponse.py +125 -0
- finance_dev/models/ebitdaestimatesresponse.py +176 -0
- finance_dev/models/ebitestimatesresponse.py +176 -0
- finance_dev/models/economicscalendarevent.py +160 -0
- finance_dev/models/economicsindicator.py +87 -0
- finance_dev/models/epsestimatesresponse.py +176 -0
- finance_dev/models/equitydetailsdto.py +569 -0
- finance_dev/models/errorcode.py +48 -0
- finance_dev/models/etblistresponse.py +43 -0
- finance_dev/models/etbsearchrequest.py +21 -0
- finance_dev/models/etbsearchresponse.py +43 -0
- finance_dev/models/etfcountryallocationresponse.py +113 -0
- finance_dev/models/etfholdingsresponse.py +163 -0
- finance_dev/models/etfprofileresponse.py +234 -0
- finance_dev/models/etfsectorallocationresponse.py +113 -0
- finance_dev/models/exchangecode.py +90 -0
- finance_dev/models/fdaadvisorycommitteecalendarresponse.py +88 -0
- finance_dev/models/filingsimilarityrecord.py +115 -0
- finance_dev/models/filingssimilarityindexdatawrapper.py +52 -0
- finance_dev/models/filingssimilarityindexresponse.py +42 -0
- finance_dev/models/financialratiosresponse.py +252 -0
- finance_dev/models/financialsreporteddatawrapper.py +49 -0
- finance_dev/models/financialsreportedresponse.py +42 -0
- finance_dev/models/financialsrevenuebreakdowndatawrapper.py +49 -0
- finance_dev/models/financialsrevenuebreakdownresponse.py +42 -0
- finance_dev/models/financialsstatementsdatawrapper.py +44 -0
- finance_dev/models/financialsstatementsresponse.py +42 -0
- finance_dev/models/financialstatement.py +171 -0
- finance_dev/models/financialstatementtype.py +14 -0
- finance_dev/models/getaccountbalanceop.py +53 -0
- finance_dev/models/getaccountpositionsop.py +53 -0
- finance_dev/models/getaccountsresponse.py +22 -0
- finance_dev/models/getaggregatetechnicalindicatorsop.py +94 -0
- finance_dev/models/getanalystinsightsop.py +164 -0
- finance_dev/models/getbankbranchesop.py +53 -0
- finance_dev/models/getbaseeventop.py +87 -0
- finance_dev/models/getbullbearanalysisop.py +91 -0
- finance_dev/models/getcashflowstatementsop.py +564 -0
- finance_dev/models/getchartconfigop.py +40 -0
- finance_dev/models/getcharthistoryop.py +122 -0
- finance_dev/models/getcharttimeop.py +39 -0
- finance_dev/models/getcompanyesgop.py +53 -0
- finance_dev/models/getcompanyexecutivesop.py +56 -0
- finance_dev/models/getcompanymetricsop.py +68 -0
- finance_dev/models/getcompanypeersop.py +53 -0
- finance_dev/models/getcompanypresentationop.py +56 -0
- finance_dev/models/getcompanyprofileop.py +86 -0
- finance_dev/models/getconferencecallsop.py +111 -0
- finance_dev/models/getconfigwatchlistbyidop.py +53 -0
- finance_dev/models/getconfigwatchlistsop.py +40 -0
- finance_dev/models/getcongressionaltradingop.py +73 -0
- finance_dev/models/getcovid19uscasesop.py +43 -0
- finance_dev/models/getdailymarketsummaryop.py +92 -0
- finance_dev/models/getdividendsop.py +294 -0
- finance_dev/models/getearningscalendarop.py +87 -0
- finance_dev/models/getearningscallliveop.py +91 -0
- finance_dev/models/getearningsqualityscoreop.py +81 -0
- finance_dev/models/getearningssurprisesop.py +80 -0
- finance_dev/models/getebitdaestimatesop.py +91 -0
- finance_dev/models/getebitestimatesop.py +88 -0
- finance_dev/models/geteconomicscalendarop.py +92 -0
- finance_dev/models/geteconomicscalendarresponse.py +56 -0
- finance_dev/models/getepsestimatesop.py +88 -0
- finance_dev/models/getequitydetailsop.py +56 -0
- finance_dev/models/getequitydetailsresponse.py +45 -0
- finance_dev/models/getetblistop.py +40 -0
- finance_dev/models/getetfcountryallocationop.py +80 -0
- finance_dev/models/getetfholdingsop.py +96 -0
- finance_dev/models/getetfprofileop.py +77 -0
- finance_dev/models/getetfsectorallocationop.py +80 -0
- finance_dev/models/geteventcontractsop.py +87 -0
- finance_dev/models/getfdaadvisorycommitteecalendarop.py +47 -0
- finance_dev/models/getfilingssimilarityindexop.py +102 -0
- finance_dev/models/getfinancialratiosop.py +612 -0
- finance_dev/models/getfinancialstatementsop.py +117 -0
- finance_dev/models/getfundownershipop.py +77 -0
- finance_dev/models/gethistoricaldataop.py +61 -0
- finance_dev/models/gethistoricalesgop.py +53 -0
- finance_dev/models/gethistorybatchop.py +74 -0
- finance_dev/models/gethistoryop.py +123 -0
- finance_dev/models/getincomestatementsop.py +564 -0
- finance_dev/models/getindexbarop.py +140 -0
- finance_dev/models/getindexbarsop.py +149 -0
- finance_dev/models/getindexchartbarsop.py +178 -0
- finance_dev/models/getindexrealtimevaluesop.py +94 -0
- finance_dev/models/getinflationexpectationsop.py +157 -0
- finance_dev/models/getinflationop.py +154 -0
- finance_dev/models/getinsidertransactionsop.py +90 -0
- finance_dev/models/getinstitutionalownershipop.py +99 -0
- finance_dev/models/getinstitutionalportfolioop.py +75 -0
- finance_dev/models/getinvestmentthemeop.py +68 -0
- finance_dev/models/getipocalendarop.py +63 -0
- finance_dev/models/getlobbyingop.py +70 -0
- finance_dev/models/getmarketbreadthop.py +40 -0
- finance_dev/models/getmarketholidaysop.py +65 -0
- finance_dev/models/getmarketstatusop.py +65 -0
- finance_dev/models/getmergersandacquisitionsop.py +113 -0
- finance_dev/models/getnetinflowop.py +40 -0
- finance_dev/models/getnewsbyidop.py +73 -0
- finance_dev/models/getnewsop.py +98 -0
- finance_dev/models/getnewssentimentop.py +53 -0
- finance_dev/models/getoptionchainsnapshotop.py +244 -0
- finance_dev/models/getoptioncontractsnapshotop.py +69 -0
- finance_dev/models/getoptiondetailsop.py +56 -0
- finance_dev/models/getoptiondetailsresponse.py +45 -0
- finance_dev/models/getoptionlasttradeop.py +56 -0
- finance_dev/models/getoptionopencloseop.py +66 -0
- finance_dev/models/getoptionpreviousdayop.py +56 -0
- finance_dev/models/getoptionquotesop.py +177 -0
- finance_dev/models/getoptionsactivityop.py +111 -0
- finance_dev/models/getoptionsetfstopvolumeop.py +70 -0
- finance_dev/models/getoptionsstockstopgainersop.py +70 -0
- finance_dev/models/getoptionsstockstopvolumeop.py +70 -0
- finance_dev/models/getoptionsunusualactivityop.py +100 -0
- finance_dev/models/getoptiontradesop.py +177 -0
- finance_dev/models/getordersv2response.py +66 -0
- finance_dev/models/getownershipdataop.py +77 -0
- finance_dev/models/getpositionsresponse.py +39 -0
- finance_dev/models/getpredictionorderop.py +88 -0
- finance_dev/models/getpricetargetop.py +53 -0
- finance_dev/models/getquotesop.py +53 -0
- finance_dev/models/getratingsop.py +164 -0
- finance_dev/models/getratingsresponse.py +39 -0
- finance_dev/models/getreportedfinancialsop.py +127 -0
- finance_dev/models/getrevenuebreakdownop.py +85 -0
- finance_dev/models/getrevenueestimatesop.py +91 -0
- finance_dev/models/getsecfilingsop.py +113 -0
- finance_dev/models/getsectortickersop.py +124 -0
- finance_dev/models/getsectorwisechangeop.py +84 -0
- finance_dev/models/getshortinterestop.py +334 -0
- finance_dev/models/getshortvolumeop.py +333 -0
- finance_dev/models/getsocialsentimentop.py +90 -0
- finance_dev/models/getspinoffsop.py +112 -0
- finance_dev/models/getstockaggregatesop.py +174 -0
- finance_dev/models/getstocklastquoteop.py +56 -0
- finance_dev/models/getstocklasttradeop.py +56 -0
- finance_dev/models/getstockopencloseop.py +90 -0
- finance_dev/models/getstockpreviousdayop.py +80 -0
- finance_dev/models/getstockquotesop.py +177 -0
- finance_dev/models/getstocksnapshotsop.py +82 -0
- finance_dev/models/getstocksplitsop.py +243 -0
- finance_dev/models/getstocktradesop.py +177 -0
- finance_dev/models/getsupplychainop.py +53 -0
- finance_dev/models/getsupportresistancelevelsop.py +90 -0
- finance_dev/models/getsymbolinfoop.py +53 -0
- finance_dev/models/gettechnicalindicatorop.py +172 -0
- finance_dev/models/gettechnicalpatternsop.py +88 -0
- finance_dev/models/gettenderoffersop.py +112 -0
- finance_dev/models/gettickhistoryop.py +104 -0
- finance_dev/models/gettopgainersop.py +78 -0
- finance_dev/models/gettoplosersop.py +78 -0
- finance_dev/models/gettopmostactiveop.py +78 -0
- finance_dev/models/gettranscriptop.py +53 -0
- finance_dev/models/gettreasuryyieldsop.py +157 -0
- finance_dev/models/getunifiedsnapshotop.py +223 -0
- finance_dev/models/getupgradesdowngradesop.py +91 -0
- finance_dev/models/getusaspendingop.py +70 -0
- finance_dev/models/getuseraccountsop.py +40 -0
- finance_dev/models/getusptopatentsop.py +70 -0
- finance_dev/models/getvisaapplicationsop.py +73 -0
- finance_dev/models/historicalesgresponse.py +439 -0
- finance_dev/models/httpmetadata.py +24 -0
- finance_dev/models/incomestatement.py +296 -0
- finance_dev/models/incomestatementsresponse.py +61 -0
- finance_dev/models/indexbarresponse.py +194 -0
- finance_dev/models/indexbarsresponse.py +123 -0
- finance_dev/models/indexchartbarsresponse.py +213 -0
- finance_dev/models/indexgroupsresponse.py +78 -0
- finance_dev/models/indexlistresponse.py +95 -0
- finance_dev/models/indexsearchresponse.py +93 -0
- finance_dev/models/indicesbygroupresponse.py +93 -0
- finance_dev/models/indicesidentifiertype.py +28 -0
- finance_dev/models/indicesrealtimeindexinfo.py +67 -0
- finance_dev/models/indicesrealtimeindexvalue.py +157 -0
- finance_dev/models/indicesrealtimevaluesitem.py +80 -0
- finance_dev/models/indicesrealtimevaluesresponse.py +42 -0
- finance_dev/models/inflationexpectationsresponse.py +140 -0
- finance_dev/models/inflationresponse.py +132 -0
- finance_dev/models/insidertransaction.py +97 -0
- finance_dev/models/insidertransactionsresponse.py +39 -0
- finance_dev/models/institutionalholding.py +77 -0
- finance_dev/models/institutionalownershipresponse.py +39 -0
- finance_dev/models/institutionalportfolioresponse.py +39 -0
- finance_dev/models/investmentthemeid.py +35 -0
- finance_dev/models/investmentthemeresponse.py +80 -0
- finance_dev/models/ipocalendarresponse.py +39 -0
- finance_dev/models/ipoitem.py +93 -0
- finance_dev/models/listactiveordersop.py +87 -0
- finance_dev/models/listcategoriesop.py +79 -0
- finance_dev/models/listindexgroupsop.py +40 -0
- finance_dev/models/listindicesbygroupop.py +58 -0
- finance_dev/models/listindicesop.py +91 -0
- finance_dev/models/listoptioncontractsop.py +66 -0
- finance_dev/models/listoptionexpirydatesop.py +56 -0
- finance_dev/models/listorderhistoryop.py +139 -0
- finance_dev/models/listpredictionordersop.py +134 -0
- finance_dev/models/listtranscriptsop.py +53 -0
- finance_dev/models/lobbyingresponse.py +166 -0
- finance_dev/models/logosearchresponse.py +152 -0
- finance_dev/models/logosyncresponse.py +277 -0
- finance_dev/models/marketbreadth.py +97 -0
- finance_dev/models/marketbreadthresponse.py +44 -0
- finance_dev/models/marketholiday.py +56 -0
- finance_dev/models/marketholidayresponse.py +39 -0
- finance_dev/models/marketstatus.py +67 -0
- finance_dev/models/mergersandacquisitionsresponse.py +186 -0
- finance_dev/models/metricseriespoint.py +43 -0
- finance_dev/models/netinflow.py +81 -0
- finance_dev/models/netinflowresponse.py +44 -0
- finance_dev/models/newsitem.py +102 -0
- finance_dev/models/newslistresponse.py +128 -0
- finance_dev/models/newssentimentresponse.py +176 -0
- finance_dev/models/newstypeenum.py +16 -0
- finance_dev/models/optionchainsnapshotresponse.py +64 -0
- finance_dev/models/optioncontractsnapshotresponse.py +64 -0
- finance_dev/models/optioncontractsnapshotrow.py +164 -0
- finance_dev/models/optioncontractsresponse.py +131 -0
- finance_dev/models/optiondetailsdto.py +72 -0
- finance_dev/models/optionexpirydatesresponse.py +53 -0
- finance_dev/models/optionlasttraderesponse.py +169 -0
- finance_dev/models/optionopencloseresponse.py +97 -0
- finance_dev/models/optionpreviousdayresponse.py +89 -0
- finance_dev/models/optionquotesresponse.py +138 -0
- finance_dev/models/optionsactivityresponse.py +265 -0
- finance_dev/models/optionsnapshotcontractdetails.py +85 -0
- finance_dev/models/optionsnapshotdaybar.py +107 -0
- finance_dev/models/optionsnapshotgreeks.py +67 -0
- finance_dev/models/optionsnapshotlastquote.py +116 -0
- finance_dev/models/optionsnapshotlasttrade.py +102 -0
- finance_dev/models/optionsnapshotunderlying.py +86 -0
- finance_dev/models/optionsscreeneritem.py +151 -0
- finance_dev/models/optionsunusualactivityresponse.py +62 -0
- finance_dev/models/optionsunusualactivitytrade.py +103 -0
- finance_dev/models/optiontradesresponse.py +132 -0
- finance_dev/models/orderrequesttimeinforceenum.py +29 -0
- finance_dev/models/ordersideenum.py +20 -0
- finance_dev/models/ordertypeenum.py +20 -0
- finance_dev/models/ordleg.py +162 -0
- finance_dev/models/ordresponse.py +202 -0
- finance_dev/models/ownershipdataresponse.py +39 -0
- finance_dev/models/ownershiprecord.py +74 -0
- finance_dev/models/placeorderop.py +40 -0
- finance_dev/models/placeordrequest_union.py +335 -0
- finance_dev/models/placepredictionorderop.py +114 -0
- finance_dev/models/predmdbaseevent.py +62 -0
- finance_dev/models/predmdbaseeventhit.py +53 -0
- finance_dev/models/predmdbaseeventsearchresult.py +46 -0
- finance_dev/models/predmdbaseeventwithevents.py +32 -0
- finance_dev/models/predmdbatchhistoryrequest.py +16 -0
- finance_dev/models/predmdbatchhistoryresponse.py +16 -0
- finance_dev/models/predmdcategory.py +48 -0
- finance_dev/models/predmdcontract.py +177 -0
- finance_dev/models/predmdcontracthit.py +157 -0
- finance_dev/models/predmdcontractsearchresult.py +46 -0
- finance_dev/models/predmdevent.py +136 -0
- finance_dev/models/predmdeventhit.py +73 -0
- finance_dev/models/predmdeventsearchresult.py +46 -0
- finance_dev/models/predmdeventwithcontracts.py +22 -0
- finance_dev/models/predmdhistoryrequest.py +59 -0
- finance_dev/models/predmdhistoryresponse.py +53 -0
- finance_dev/models/predmdtick.py +53 -0
- finance_dev/models/predordersapperror.py +78 -0
- finance_dev/models/predordersorder.py +267 -0
- finance_dev/models/predordersorderdetail.py +26 -0
- finance_dev/models/predordersorderpage.py +45 -0
- finance_dev/models/predordersorderreport.py +88 -0
- finance_dev/models/predordersplaceorderrequest.py +159 -0
- finance_dev/models/previeworderop.py +40 -0
- finance_dev/models/previeworderresponse.py +127 -0
- finance_dev/models/pricetargetresponse.py +89 -0
- finance_dev/models/quotedata.py +49 -0
- finance_dev/models/quotesresponse.py +62 -0
- finance_dev/models/quotevalues.py +114 -0
- finance_dev/models/rating.py +193 -0
- finance_dev/models/ratingsaccuracy.py +242 -0
- finance_dev/models/replaceconfigwatchlistsop.py +40 -0
- finance_dev/models/replaceorderop.py +40 -0
- finance_dev/models/replaceordrequest_union.py +367 -0
- finance_dev/models/replaceordresponse.py +144 -0
- finance_dev/models/reportedbsitem.py +53 -0
- finance_dev/models/reportedfiling.py +110 -0
- finance_dev/models/reportedreport.py +39 -0
- finance_dev/models/reportingfrequency.py +16 -0
- finance_dev/models/revenuebreakdownaxis.py +52 -0
- finance_dev/models/revenuebreakdowndatapoint.py +58 -0
- finance_dev/models/revenuebreakdownentry.py +51 -0
- finance_dev/models/revenuebreakdowninner.py +75 -0
- finance_dev/models/revenueestimatesresponse.py +176 -0
- finance_dev/models/screenclause.py +70 -0
- finance_dev/models/screengroup.py +75 -0
- finance_dev/models/searchetbsymbolsop.py +40 -0
- finance_dev/models/searchindicesop.py +55 -0
- finance_dev/models/searchlogosop.py +158 -0
- finance_dev/models/searchmarketsymbolsop.py +80 -0
- finance_dev/models/searchop.py +232 -0
- finance_dev/models/searchsymbolitem.py +76 -0
- finance_dev/models/searchsymbolresponseitem.py +71 -0
- finance_dev/models/searchsymbolsop.py +77 -0
- finance_dev/models/secfiling.py +91 -0
- finance_dev/models/secfilingsresponse.py +39 -0
- finance_dev/models/sectoravgchange.py +50 -0
- finance_dev/models/security.py +59 -0
- finance_dev/models/securitytypeenum.py +16 -0
- finance_dev/models/shortinterestresponse.py +126 -0
- finance_dev/models/shortvolumeresponse.py +198 -0
- finance_dev/models/socialsentimentresponse.py +124 -0
- finance_dev/models/sortorderenum.py +13 -0
- finance_dev/models/spinoffsresponse.py +136 -0
- finance_dev/models/stockaggregatesresponse.py +92 -0
- finance_dev/models/stocklastquoteresponse.py +175 -0
- finance_dev/models/stocklasttraderesponse.py +169 -0
- finance_dev/models/stockohlcbar.py +85 -0
- finance_dev/models/stockopencloseresponse.py +109 -0
- finance_dev/models/stockpreviousdayresponse.py +86 -0
- finance_dev/models/stockquotesresponse.py +170 -0
- finance_dev/models/stockscreenerop.py +144 -0
- finance_dev/models/stockscreenerrequest.py +131 -0
- finance_dev/models/stockscreenerresponse.py +197 -0
- finance_dev/models/stocksnapshotsresponse.py +454 -0
- finance_dev/models/stocksplitsresponse.py +144 -0
- finance_dev/models/stocktradesresponse.py +164 -0
- finance_dev/models/supplychainresponse.py +158 -0
- finance_dev/models/supportresistancelevelsresponse.py +68 -0
- finance_dev/models/symboldetails.py +119 -0
- finance_dev/models/symbolerror.py +43 -0
- finance_dev/models/symbolinfo.py +183 -0
- finance_dev/models/synclogosop.py +146 -0
- finance_dev/models/technicalindicatorresponse.py +43 -0
- finance_dev/models/technicalindicatortype.py +21 -0
- finance_dev/models/technicalpatternsresponse.py +249 -0
- finance_dev/models/tenderofferidentifiertype.py +26 -0
- finance_dev/models/tenderoffersresponse.py +548 -0
- finance_dev/models/tickchartbars.py +104 -0
- finance_dev/models/tickresolution.py +20 -0
- finance_dev/models/timeinforceenum.py +26 -0
- finance_dev/models/tradeorderlegv2.py +164 -0
- finance_dev/models/tradeorderv2.py +434 -0
- finance_dev/models/transcriptresponse.py +162 -0
- finance_dev/models/transcriptsresponse.py +89 -0
- finance_dev/models/treasuryyieldsresponse.py +160 -0
- finance_dev/models/unifiedsnapshotresponse.py +308 -0
- finance_dev/models/updateconfigwatchlistbyidop.py +65 -0
- finance_dev/models/updatewatchlistrequest_union.py +134 -0
- finance_dev/models/upgradesdowngradesresponse.py +98 -0
- finance_dev/models/usaspendingresponse.py +222 -0
- finance_dev/models/usptopatentsresponse.py +134 -0
- finance_dev/models/visaapplicationsresponse.py +228 -0
- finance_dev/models/watchlist.py +68 -0
- finance_dev/models/watchlistrequest.py +43 -0
- finance_dev/models/watchlistresponse.py +44 -0
- finance_dev/news_sdk.py +829 -0
- finance_dev/options.py +3443 -0
- finance_dev/orders.py +1907 -0
- finance_dev/ownership.py +1386 -0
- finance_dev/predictions.py +29 -0
- finance_dev/predictions_orders.py +852 -0
- finance_dev/py.typed +1 -0
- finance_dev/sdk.py +347 -0
- finance_dev/sdkconfiguration.py +50 -0
- finance_dev/signals.py +338 -0
- finance_dev/stocks.py +3131 -0
- finance_dev/technicalanalysis_sdk.py +1137 -0
- finance_dev/types/__init__.py +25 -0
- finance_dev/types/base64fileinput.py +44 -0
- finance_dev/types/basemodel.py +78 -0
- finance_dev/utils/__init__.py +181 -0
- finance_dev/utils/annotations.py +80 -0
- finance_dev/utils/datetimes.py +42 -0
- finance_dev/utils/dynamic_imports.py +55 -0
- finance_dev/utils/enums.py +135 -0
- finance_dev/utils/eventstreaming.py +327 -0
- finance_dev/utils/forms.py +240 -0
- finance_dev/utils/headers.py +137 -0
- finance_dev/utils/logger.py +23 -0
- finance_dev/utils/metadata.py +120 -0
- finance_dev/utils/queryparams.py +218 -0
- finance_dev/utils/requestbodies.py +68 -0
- finance_dev/utils/retries.py +373 -0
- finance_dev/utils/security.py +199 -0
- finance_dev/utils/serializers.py +327 -0
- finance_dev/utils/unmarshal_json_response.py +39 -0
- finance_dev/utils/url.py +155 -0
- finance_dev/utils/values.py +143 -0
- finance_dev/watchlist_sdk.py +1583 -0
- finance_dev/websocket/__init__.py +57 -0
- finance_dev/websocket/account.py +5 -0
- finance_dev/websocket/auth.py +124 -0
- finance_dev/websocket/chart.py +5 -0
- finance_dev/websocket/codec.py +66 -0
- finance_dev/websocket/config.py +52 -0
- finance_dev/websocket/errors.py +54 -0
- finance_dev/websocket/market.py +5 -0
- finance_dev/websocket/models/__init__.py +52 -0
- finance_dev/websocket/models/account.py +60 -0
- finance_dev/websocket/models/chart.py +44 -0
- finance_dev/websocket/models/common.py +85 -0
- finance_dev/websocket/models/market.py +113 -0
- finance_dev/websocket/resources.py +327 -0
- finance_dev/websocket/sdk.py +13 -0
- finance_dev/websocket/transport/async_connection.py +493 -0
- finance_dev/websocket/transport/base.py +78 -0
- finance_dev/websocket/transport/sync_connection.py +470 -0
- finance_dev-0.9.0.dist-info/METADATA +913 -0
- finance_dev-0.9.0.dist-info/RECORD +486 -0
- finance_dev-0.9.0.dist-info/WHEEL +5 -0
- finance_dev-0.9.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,1137 @@
|
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
|
2
|
+
# @generated-id: 843e7690f3cc
|
|
3
|
+
|
|
4
|
+
from .basesdk import BaseSDK
|
|
5
|
+
from finance_dev import errors, models, utils
|
|
6
|
+
from finance_dev._hooks import HookContext
|
|
7
|
+
from finance_dev.types import OptionalNullable, UNSET
|
|
8
|
+
from finance_dev.utils.unmarshal_json_response import unmarshal_json_response
|
|
9
|
+
from typing import Any, Mapping, Optional
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class TechnicalAnalysisSDK(BaseSDK):
|
|
13
|
+
def get_technical_indicator(
|
|
14
|
+
self,
|
|
15
|
+
*,
|
|
16
|
+
symbol: str,
|
|
17
|
+
resolution: models.GetTechnicalIndicatorResolution,
|
|
18
|
+
indicator: models.TechnicalIndicatorType,
|
|
19
|
+
from_: int,
|
|
20
|
+
to: int,
|
|
21
|
+
timeperiod: Optional[int] = None,
|
|
22
|
+
fast_period: Optional[int] = None,
|
|
23
|
+
slow_period: Optional[int] = None,
|
|
24
|
+
signal_period: Optional[int] = None,
|
|
25
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
26
|
+
server_url: Optional[str] = None,
|
|
27
|
+
timeout_ms: Optional[int] = None,
|
|
28
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
29
|
+
) -> models.GetTechnicalIndicatorResponse:
|
|
30
|
+
r"""Get Technical Indicator Data
|
|
31
|
+
|
|
32
|
+
Retrieve calculated technical indicator values including SMA, EMA, RSI, MACD, Bollinger Bands, and other charting indicators.
|
|
33
|
+
|
|
34
|
+
If `from` or `to` cannot be parsed as a signed 64-bit integer, returns 400 Bad Request with error code `INVALID_PARAMETER` and message `invalid from parameter` or `invalid to parameter`. Invalid indicator requests rejected by the data provider return 400 Bad Request with error code `BAD_REQUEST`; the message includes provider error details when suitable for public responses, otherwise `Invalid request parameters.`.
|
|
35
|
+
|
|
36
|
+
If set, this operation will use `client_id` from the global security.
|
|
37
|
+
|
|
38
|
+
: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`.
|
|
39
|
+
:param resolution: How long each bar covers. Supported values are minutes (`1`, `5`, `15`, `30`, `60`) or daily/weekly/monthly (`D`, `W`, `M`). Other values return 400 Bad Request with error code `VALIDATION_ERROR`.
|
|
40
|
+
:param indicator: Which technical indicator to compute. Common picks: `sma` (simple moving average), `ema` (exponential moving average), `rsi` (relative strength index), `macd` (moving-average convergence-divergence), `bbands` (Bollinger Bands). See `TechnicalIndicatorType` for the full list of supported slugs.
|
|
41
|
+
:param from_: Start timestamp (Unix seconds)
|
|
42
|
+
:param to: End timestamp (Unix seconds)
|
|
43
|
+
:param timeperiod: (Optional) Period for SMA/RSI/BBANDS
|
|
44
|
+
:param fast_period: MACD fast EMA length, in bars. The shorter of the two moving averages used to compute MACD. Standard value is 12. Only used when `indicator=macd`.
|
|
45
|
+
:param slow_period: MACD slow EMA length, in bars. The longer of the two moving averages used to compute MACD. Standard value is 26. Only used when `indicator=macd`.
|
|
46
|
+
:param signal_period: MACD signal EMA length, in bars. Used to smooth the MACD line into the signal line; crossovers between the two are the basic MACD trading cue. Standard value is 9. Only used when `indicator=macd`.
|
|
47
|
+
:param retries: Override the default retry configuration for this method
|
|
48
|
+
:param server_url: Override the default server URL for this method
|
|
49
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
50
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
51
|
+
"""
|
|
52
|
+
base_url = None
|
|
53
|
+
url_variables = None
|
|
54
|
+
if timeout_ms is None:
|
|
55
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
56
|
+
|
|
57
|
+
if timeout_ms is None:
|
|
58
|
+
timeout_ms = 30000
|
|
59
|
+
|
|
60
|
+
if server_url is not None:
|
|
61
|
+
base_url = server_url
|
|
62
|
+
else:
|
|
63
|
+
base_url = self._get_url(base_url, url_variables)
|
|
64
|
+
|
|
65
|
+
request = models.GetTechnicalIndicatorRequest(
|
|
66
|
+
symbol=symbol,
|
|
67
|
+
resolution=resolution,
|
|
68
|
+
indicator=indicator,
|
|
69
|
+
from_=from_,
|
|
70
|
+
to=to,
|
|
71
|
+
timeperiod=timeperiod,
|
|
72
|
+
fast_period=fast_period,
|
|
73
|
+
slow_period=slow_period,
|
|
74
|
+
signal_period=signal_period,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
req = self._build_request(
|
|
78
|
+
method="GET",
|
|
79
|
+
path="/v1/indicator",
|
|
80
|
+
base_url=base_url,
|
|
81
|
+
url_variables=url_variables,
|
|
82
|
+
request=request,
|
|
83
|
+
request_body_required=False,
|
|
84
|
+
request_has_path_params=False,
|
|
85
|
+
request_has_query_params=True,
|
|
86
|
+
user_agent_header="user-agent",
|
|
87
|
+
accept_header_value="application/json",
|
|
88
|
+
http_headers=http_headers,
|
|
89
|
+
security=self.sdk_configuration.security,
|
|
90
|
+
allow_empty_value=None,
|
|
91
|
+
allowed_fields=["client_id"],
|
|
92
|
+
timeout_ms=timeout_ms,
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
if retries == UNSET:
|
|
96
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
97
|
+
retries = self.sdk_configuration.retry_config
|
|
98
|
+
else:
|
|
99
|
+
retries = utils.RetryConfig(
|
|
100
|
+
"backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
retry_config = None
|
|
104
|
+
if isinstance(retries, utils.RetryConfig):
|
|
105
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
106
|
+
|
|
107
|
+
http_res = self.do_request(
|
|
108
|
+
hook_ctx=HookContext(
|
|
109
|
+
config=self.sdk_configuration,
|
|
110
|
+
base_url=base_url or "",
|
|
111
|
+
operation_id="getTechnicalIndicator",
|
|
112
|
+
oauth2_scopes=["market:supplemental"],
|
|
113
|
+
security_source=self.sdk_configuration.security,
|
|
114
|
+
tags=["Technical Analysis"],
|
|
115
|
+
extensions=None,
|
|
116
|
+
),
|
|
117
|
+
request=req,
|
|
118
|
+
is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
|
|
119
|
+
retry_config=retry_config,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
response_data: Any = None
|
|
123
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
124
|
+
return models.GetTechnicalIndicatorResponse(
|
|
125
|
+
technical_indicator_response=unmarshal_json_response(
|
|
126
|
+
Optional[models.TechnicalIndicatorResponse], http_res
|
|
127
|
+
),
|
|
128
|
+
http_meta=models.HTTPMetadata(request=req, response=http_res),
|
|
129
|
+
)
|
|
130
|
+
if utils.match_response(http_res, "400", "application/json"):
|
|
131
|
+
response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
|
|
132
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
133
|
+
request=req, response=http_res
|
|
134
|
+
)
|
|
135
|
+
raise errors.BadRequest(response_data, http_res)
|
|
136
|
+
if utils.match_response(http_res, "401", "application/json"):
|
|
137
|
+
response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
|
|
138
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
139
|
+
request=req, response=http_res
|
|
140
|
+
)
|
|
141
|
+
raise errors.Unauthorized(response_data, http_res)
|
|
142
|
+
if utils.match_response(http_res, "403", "application/json"):
|
|
143
|
+
response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
|
|
144
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
145
|
+
request=req, response=http_res
|
|
146
|
+
)
|
|
147
|
+
raise errors.Forbidden(response_data, http_res)
|
|
148
|
+
if utils.match_response(http_res, "404", "application/json"):
|
|
149
|
+
response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
|
|
150
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
151
|
+
request=req, response=http_res
|
|
152
|
+
)
|
|
153
|
+
raise errors.NotFound(response_data, http_res)
|
|
154
|
+
if utils.match_response(http_res, "500", "application/json"):
|
|
155
|
+
response_data = unmarshal_json_response(
|
|
156
|
+
errors.InternalServerErrorUnion, http_res
|
|
157
|
+
)
|
|
158
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
159
|
+
request=req, response=http_res
|
|
160
|
+
)
|
|
161
|
+
raise errors.InternalServerError(response_data, http_res)
|
|
162
|
+
if utils.match_response(http_res, "4XX", "*"):
|
|
163
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
164
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
165
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
166
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
167
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
168
|
+
|
|
169
|
+
raise errors.APIError("Unexpected response received", http_res)
|
|
170
|
+
|
|
171
|
+
async def get_technical_indicator_async(
|
|
172
|
+
self,
|
|
173
|
+
*,
|
|
174
|
+
symbol: str,
|
|
175
|
+
resolution: models.GetTechnicalIndicatorResolution,
|
|
176
|
+
indicator: models.TechnicalIndicatorType,
|
|
177
|
+
from_: int,
|
|
178
|
+
to: int,
|
|
179
|
+
timeperiod: Optional[int] = None,
|
|
180
|
+
fast_period: Optional[int] = None,
|
|
181
|
+
slow_period: Optional[int] = None,
|
|
182
|
+
signal_period: Optional[int] = None,
|
|
183
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
184
|
+
server_url: Optional[str] = None,
|
|
185
|
+
timeout_ms: Optional[int] = None,
|
|
186
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
187
|
+
) -> models.GetTechnicalIndicatorResponse:
|
|
188
|
+
r"""Get Technical Indicator Data
|
|
189
|
+
|
|
190
|
+
Retrieve calculated technical indicator values including SMA, EMA, RSI, MACD, Bollinger Bands, and other charting indicators.
|
|
191
|
+
|
|
192
|
+
If `from` or `to` cannot be parsed as a signed 64-bit integer, returns 400 Bad Request with error code `INVALID_PARAMETER` and message `invalid from parameter` or `invalid to parameter`. Invalid indicator requests rejected by the data provider return 400 Bad Request with error code `BAD_REQUEST`; the message includes provider error details when suitable for public responses, otherwise `Invalid request parameters.`.
|
|
193
|
+
|
|
194
|
+
If set, this operation will use `client_id` from the global security.
|
|
195
|
+
|
|
196
|
+
: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`.
|
|
197
|
+
:param resolution: How long each bar covers. Supported values are minutes (`1`, `5`, `15`, `30`, `60`) or daily/weekly/monthly (`D`, `W`, `M`). Other values return 400 Bad Request with error code `VALIDATION_ERROR`.
|
|
198
|
+
:param indicator: Which technical indicator to compute. Common picks: `sma` (simple moving average), `ema` (exponential moving average), `rsi` (relative strength index), `macd` (moving-average convergence-divergence), `bbands` (Bollinger Bands). See `TechnicalIndicatorType` for the full list of supported slugs.
|
|
199
|
+
:param from_: Start timestamp (Unix seconds)
|
|
200
|
+
:param to: End timestamp (Unix seconds)
|
|
201
|
+
:param timeperiod: (Optional) Period for SMA/RSI/BBANDS
|
|
202
|
+
:param fast_period: MACD fast EMA length, in bars. The shorter of the two moving averages used to compute MACD. Standard value is 12. Only used when `indicator=macd`.
|
|
203
|
+
:param slow_period: MACD slow EMA length, in bars. The longer of the two moving averages used to compute MACD. Standard value is 26. Only used when `indicator=macd`.
|
|
204
|
+
:param signal_period: MACD signal EMA length, in bars. Used to smooth the MACD line into the signal line; crossovers between the two are the basic MACD trading cue. Standard value is 9. Only used when `indicator=macd`.
|
|
205
|
+
:param retries: Override the default retry configuration for this method
|
|
206
|
+
:param server_url: Override the default server URL for this method
|
|
207
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
208
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
209
|
+
"""
|
|
210
|
+
base_url = None
|
|
211
|
+
url_variables = None
|
|
212
|
+
if timeout_ms is None:
|
|
213
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
214
|
+
|
|
215
|
+
if timeout_ms is None:
|
|
216
|
+
timeout_ms = 30000
|
|
217
|
+
|
|
218
|
+
if server_url is not None:
|
|
219
|
+
base_url = server_url
|
|
220
|
+
else:
|
|
221
|
+
base_url = self._get_url(base_url, url_variables)
|
|
222
|
+
|
|
223
|
+
request = models.GetTechnicalIndicatorRequest(
|
|
224
|
+
symbol=symbol,
|
|
225
|
+
resolution=resolution,
|
|
226
|
+
indicator=indicator,
|
|
227
|
+
from_=from_,
|
|
228
|
+
to=to,
|
|
229
|
+
timeperiod=timeperiod,
|
|
230
|
+
fast_period=fast_period,
|
|
231
|
+
slow_period=slow_period,
|
|
232
|
+
signal_period=signal_period,
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
req = self._build_request_async(
|
|
236
|
+
method="GET",
|
|
237
|
+
path="/v1/indicator",
|
|
238
|
+
base_url=base_url,
|
|
239
|
+
url_variables=url_variables,
|
|
240
|
+
request=request,
|
|
241
|
+
request_body_required=False,
|
|
242
|
+
request_has_path_params=False,
|
|
243
|
+
request_has_query_params=True,
|
|
244
|
+
user_agent_header="user-agent",
|
|
245
|
+
accept_header_value="application/json",
|
|
246
|
+
http_headers=http_headers,
|
|
247
|
+
security=self.sdk_configuration.security,
|
|
248
|
+
allow_empty_value=None,
|
|
249
|
+
allowed_fields=["client_id"],
|
|
250
|
+
timeout_ms=timeout_ms,
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
if retries == UNSET:
|
|
254
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
255
|
+
retries = self.sdk_configuration.retry_config
|
|
256
|
+
else:
|
|
257
|
+
retries = utils.RetryConfig(
|
|
258
|
+
"backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
|
|
259
|
+
)
|
|
260
|
+
|
|
261
|
+
retry_config = None
|
|
262
|
+
if isinstance(retries, utils.RetryConfig):
|
|
263
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
264
|
+
|
|
265
|
+
http_res = await self.do_request_async(
|
|
266
|
+
hook_ctx=HookContext(
|
|
267
|
+
config=self.sdk_configuration,
|
|
268
|
+
base_url=base_url or "",
|
|
269
|
+
operation_id="getTechnicalIndicator",
|
|
270
|
+
oauth2_scopes=["market:supplemental"],
|
|
271
|
+
security_source=self.sdk_configuration.security,
|
|
272
|
+
tags=["Technical Analysis"],
|
|
273
|
+
extensions=None,
|
|
274
|
+
),
|
|
275
|
+
request=req,
|
|
276
|
+
is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
|
|
277
|
+
retry_config=retry_config,
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
response_data: Any = None
|
|
281
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
282
|
+
return models.GetTechnicalIndicatorResponse(
|
|
283
|
+
technical_indicator_response=unmarshal_json_response(
|
|
284
|
+
Optional[models.TechnicalIndicatorResponse], http_res
|
|
285
|
+
),
|
|
286
|
+
http_meta=models.HTTPMetadata(request=req, response=http_res),
|
|
287
|
+
)
|
|
288
|
+
if utils.match_response(http_res, "400", "application/json"):
|
|
289
|
+
response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
|
|
290
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
291
|
+
request=req, response=http_res
|
|
292
|
+
)
|
|
293
|
+
raise errors.BadRequest(response_data, http_res)
|
|
294
|
+
if utils.match_response(http_res, "401", "application/json"):
|
|
295
|
+
response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
|
|
296
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
297
|
+
request=req, response=http_res
|
|
298
|
+
)
|
|
299
|
+
raise errors.Unauthorized(response_data, http_res)
|
|
300
|
+
if utils.match_response(http_res, "403", "application/json"):
|
|
301
|
+
response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
|
|
302
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
303
|
+
request=req, response=http_res
|
|
304
|
+
)
|
|
305
|
+
raise errors.Forbidden(response_data, http_res)
|
|
306
|
+
if utils.match_response(http_res, "404", "application/json"):
|
|
307
|
+
response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
|
|
308
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
309
|
+
request=req, response=http_res
|
|
310
|
+
)
|
|
311
|
+
raise errors.NotFound(response_data, http_res)
|
|
312
|
+
if utils.match_response(http_res, "500", "application/json"):
|
|
313
|
+
response_data = unmarshal_json_response(
|
|
314
|
+
errors.InternalServerErrorUnion, http_res
|
|
315
|
+
)
|
|
316
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
317
|
+
request=req, response=http_res
|
|
318
|
+
)
|
|
319
|
+
raise errors.InternalServerError(response_data, http_res)
|
|
320
|
+
if utils.match_response(http_res, "4XX", "*"):
|
|
321
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
322
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
323
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
324
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
325
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
326
|
+
|
|
327
|
+
raise errors.APIError("Unexpected response received", http_res)
|
|
328
|
+
|
|
329
|
+
def get_technical_patterns(
|
|
330
|
+
self,
|
|
331
|
+
*,
|
|
332
|
+
symbol: str,
|
|
333
|
+
resolution: models.GetTechnicalPatternsResolution,
|
|
334
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
335
|
+
server_url: Optional[str] = None,
|
|
336
|
+
timeout_ms: Optional[int] = None,
|
|
337
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
338
|
+
) -> models.GetTechnicalPatternsResponse:
|
|
339
|
+
r"""Get Technical Patterns
|
|
340
|
+
|
|
341
|
+
Retrieve identified technical chart patterns including head and shoulders, double tops/bottoms, triangles, and other price formation signals.
|
|
342
|
+
|
|
343
|
+
If set, this operation will use `client_id` from the global security.
|
|
344
|
+
|
|
345
|
+
: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`.
|
|
346
|
+
:param resolution: How long each bar covers. Supported values are minutes (`1`, `5`, `15`, `30`, `60`) or daily/weekly/monthly (`D`, `W`, `M`). Other values return 400 Bad Request with error code `VALIDATION_ERROR`.
|
|
347
|
+
:param retries: Override the default retry configuration for this method
|
|
348
|
+
:param server_url: Override the default server URL for this method
|
|
349
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
350
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
351
|
+
"""
|
|
352
|
+
base_url = None
|
|
353
|
+
url_variables = None
|
|
354
|
+
if timeout_ms is None:
|
|
355
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
356
|
+
|
|
357
|
+
if timeout_ms is None:
|
|
358
|
+
timeout_ms = 30000
|
|
359
|
+
|
|
360
|
+
if server_url is not None:
|
|
361
|
+
base_url = server_url
|
|
362
|
+
else:
|
|
363
|
+
base_url = self._get_url(base_url, url_variables)
|
|
364
|
+
|
|
365
|
+
request = models.GetTechnicalPatternsRequest(
|
|
366
|
+
symbol=symbol,
|
|
367
|
+
resolution=resolution,
|
|
368
|
+
)
|
|
369
|
+
|
|
370
|
+
req = self._build_request(
|
|
371
|
+
method="GET",
|
|
372
|
+
path="/v1/scan/pattern",
|
|
373
|
+
base_url=base_url,
|
|
374
|
+
url_variables=url_variables,
|
|
375
|
+
request=request,
|
|
376
|
+
request_body_required=False,
|
|
377
|
+
request_has_path_params=False,
|
|
378
|
+
request_has_query_params=True,
|
|
379
|
+
user_agent_header="user-agent",
|
|
380
|
+
accept_header_value="application/json",
|
|
381
|
+
http_headers=http_headers,
|
|
382
|
+
security=self.sdk_configuration.security,
|
|
383
|
+
allow_empty_value=None,
|
|
384
|
+
allowed_fields=["client_id"],
|
|
385
|
+
timeout_ms=timeout_ms,
|
|
386
|
+
)
|
|
387
|
+
|
|
388
|
+
if retries == UNSET:
|
|
389
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
390
|
+
retries = self.sdk_configuration.retry_config
|
|
391
|
+
else:
|
|
392
|
+
retries = utils.RetryConfig(
|
|
393
|
+
"backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
|
|
394
|
+
)
|
|
395
|
+
|
|
396
|
+
retry_config = None
|
|
397
|
+
if isinstance(retries, utils.RetryConfig):
|
|
398
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
399
|
+
|
|
400
|
+
http_res = self.do_request(
|
|
401
|
+
hook_ctx=HookContext(
|
|
402
|
+
config=self.sdk_configuration,
|
|
403
|
+
base_url=base_url or "",
|
|
404
|
+
operation_id="getTechnicalPatterns",
|
|
405
|
+
oauth2_scopes=["market:supplemental"],
|
|
406
|
+
security_source=self.sdk_configuration.security,
|
|
407
|
+
tags=["Technical Analysis"],
|
|
408
|
+
extensions=None,
|
|
409
|
+
),
|
|
410
|
+
request=req,
|
|
411
|
+
is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
|
|
412
|
+
retry_config=retry_config,
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
response_data: Any = None
|
|
416
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
417
|
+
return models.GetTechnicalPatternsResponse(
|
|
418
|
+
technical_patterns_response=unmarshal_json_response(
|
|
419
|
+
Optional[models.TechnicalPatternsResponse], http_res
|
|
420
|
+
),
|
|
421
|
+
http_meta=models.HTTPMetadata(request=req, response=http_res),
|
|
422
|
+
)
|
|
423
|
+
if utils.match_response(http_res, "400", "application/json"):
|
|
424
|
+
response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
|
|
425
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
426
|
+
request=req, response=http_res
|
|
427
|
+
)
|
|
428
|
+
raise errors.BadRequest(response_data, http_res)
|
|
429
|
+
if utils.match_response(http_res, "401", "application/json"):
|
|
430
|
+
response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
|
|
431
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
432
|
+
request=req, response=http_res
|
|
433
|
+
)
|
|
434
|
+
raise errors.Unauthorized(response_data, http_res)
|
|
435
|
+
if utils.match_response(http_res, "403", "application/json"):
|
|
436
|
+
response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
|
|
437
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
438
|
+
request=req, response=http_res
|
|
439
|
+
)
|
|
440
|
+
raise errors.Forbidden(response_data, http_res)
|
|
441
|
+
if utils.match_response(http_res, "404", "application/json"):
|
|
442
|
+
response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
|
|
443
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
444
|
+
request=req, response=http_res
|
|
445
|
+
)
|
|
446
|
+
raise errors.NotFound(response_data, http_res)
|
|
447
|
+
if utils.match_response(http_res, "500", "application/json"):
|
|
448
|
+
response_data = unmarshal_json_response(
|
|
449
|
+
errors.InternalServerErrorUnion, http_res
|
|
450
|
+
)
|
|
451
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
452
|
+
request=req, response=http_res
|
|
453
|
+
)
|
|
454
|
+
raise errors.InternalServerError(response_data, http_res)
|
|
455
|
+
if utils.match_response(http_res, "4XX", "*"):
|
|
456
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
457
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
458
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
459
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
460
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
461
|
+
|
|
462
|
+
raise errors.APIError("Unexpected response received", http_res)
|
|
463
|
+
|
|
464
|
+
async def get_technical_patterns_async(
|
|
465
|
+
self,
|
|
466
|
+
*,
|
|
467
|
+
symbol: str,
|
|
468
|
+
resolution: models.GetTechnicalPatternsResolution,
|
|
469
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
470
|
+
server_url: Optional[str] = None,
|
|
471
|
+
timeout_ms: Optional[int] = None,
|
|
472
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
473
|
+
) -> models.GetTechnicalPatternsResponse:
|
|
474
|
+
r"""Get Technical Patterns
|
|
475
|
+
|
|
476
|
+
Retrieve identified technical chart patterns including head and shoulders, double tops/bottoms, triangles, and other price formation signals.
|
|
477
|
+
|
|
478
|
+
If set, this operation will use `client_id` from the global security.
|
|
479
|
+
|
|
480
|
+
: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`.
|
|
481
|
+
:param resolution: How long each bar covers. Supported values are minutes (`1`, `5`, `15`, `30`, `60`) or daily/weekly/monthly (`D`, `W`, `M`). Other values return 400 Bad Request with error code `VALIDATION_ERROR`.
|
|
482
|
+
:param retries: Override the default retry configuration for this method
|
|
483
|
+
:param server_url: Override the default server URL for this method
|
|
484
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
485
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
486
|
+
"""
|
|
487
|
+
base_url = None
|
|
488
|
+
url_variables = None
|
|
489
|
+
if timeout_ms is None:
|
|
490
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
491
|
+
|
|
492
|
+
if timeout_ms is None:
|
|
493
|
+
timeout_ms = 30000
|
|
494
|
+
|
|
495
|
+
if server_url is not None:
|
|
496
|
+
base_url = server_url
|
|
497
|
+
else:
|
|
498
|
+
base_url = self._get_url(base_url, url_variables)
|
|
499
|
+
|
|
500
|
+
request = models.GetTechnicalPatternsRequest(
|
|
501
|
+
symbol=symbol,
|
|
502
|
+
resolution=resolution,
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
req = self._build_request_async(
|
|
506
|
+
method="GET",
|
|
507
|
+
path="/v1/scan/pattern",
|
|
508
|
+
base_url=base_url,
|
|
509
|
+
url_variables=url_variables,
|
|
510
|
+
request=request,
|
|
511
|
+
request_body_required=False,
|
|
512
|
+
request_has_path_params=False,
|
|
513
|
+
request_has_query_params=True,
|
|
514
|
+
user_agent_header="user-agent",
|
|
515
|
+
accept_header_value="application/json",
|
|
516
|
+
http_headers=http_headers,
|
|
517
|
+
security=self.sdk_configuration.security,
|
|
518
|
+
allow_empty_value=None,
|
|
519
|
+
allowed_fields=["client_id"],
|
|
520
|
+
timeout_ms=timeout_ms,
|
|
521
|
+
)
|
|
522
|
+
|
|
523
|
+
if retries == UNSET:
|
|
524
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
525
|
+
retries = self.sdk_configuration.retry_config
|
|
526
|
+
else:
|
|
527
|
+
retries = utils.RetryConfig(
|
|
528
|
+
"backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
|
|
529
|
+
)
|
|
530
|
+
|
|
531
|
+
retry_config = None
|
|
532
|
+
if isinstance(retries, utils.RetryConfig):
|
|
533
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
534
|
+
|
|
535
|
+
http_res = await self.do_request_async(
|
|
536
|
+
hook_ctx=HookContext(
|
|
537
|
+
config=self.sdk_configuration,
|
|
538
|
+
base_url=base_url or "",
|
|
539
|
+
operation_id="getTechnicalPatterns",
|
|
540
|
+
oauth2_scopes=["market:supplemental"],
|
|
541
|
+
security_source=self.sdk_configuration.security,
|
|
542
|
+
tags=["Technical Analysis"],
|
|
543
|
+
extensions=None,
|
|
544
|
+
),
|
|
545
|
+
request=req,
|
|
546
|
+
is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
|
|
547
|
+
retry_config=retry_config,
|
|
548
|
+
)
|
|
549
|
+
|
|
550
|
+
response_data: Any = None
|
|
551
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
552
|
+
return models.GetTechnicalPatternsResponse(
|
|
553
|
+
technical_patterns_response=unmarshal_json_response(
|
|
554
|
+
Optional[models.TechnicalPatternsResponse], http_res
|
|
555
|
+
),
|
|
556
|
+
http_meta=models.HTTPMetadata(request=req, response=http_res),
|
|
557
|
+
)
|
|
558
|
+
if utils.match_response(http_res, "400", "application/json"):
|
|
559
|
+
response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
|
|
560
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
561
|
+
request=req, response=http_res
|
|
562
|
+
)
|
|
563
|
+
raise errors.BadRequest(response_data, http_res)
|
|
564
|
+
if utils.match_response(http_res, "401", "application/json"):
|
|
565
|
+
response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
|
|
566
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
567
|
+
request=req, response=http_res
|
|
568
|
+
)
|
|
569
|
+
raise errors.Unauthorized(response_data, http_res)
|
|
570
|
+
if utils.match_response(http_res, "403", "application/json"):
|
|
571
|
+
response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
|
|
572
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
573
|
+
request=req, response=http_res
|
|
574
|
+
)
|
|
575
|
+
raise errors.Forbidden(response_data, http_res)
|
|
576
|
+
if utils.match_response(http_res, "404", "application/json"):
|
|
577
|
+
response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
|
|
578
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
579
|
+
request=req, response=http_res
|
|
580
|
+
)
|
|
581
|
+
raise errors.NotFound(response_data, http_res)
|
|
582
|
+
if utils.match_response(http_res, "500", "application/json"):
|
|
583
|
+
response_data = unmarshal_json_response(
|
|
584
|
+
errors.InternalServerErrorUnion, http_res
|
|
585
|
+
)
|
|
586
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
587
|
+
request=req, response=http_res
|
|
588
|
+
)
|
|
589
|
+
raise errors.InternalServerError(response_data, http_res)
|
|
590
|
+
if utils.match_response(http_res, "4XX", "*"):
|
|
591
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
592
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
593
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
594
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
595
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
596
|
+
|
|
597
|
+
raise errors.APIError("Unexpected response received", http_res)
|
|
598
|
+
|
|
599
|
+
def get_support_resistance_levels(
|
|
600
|
+
self,
|
|
601
|
+
*,
|
|
602
|
+
symbol: str,
|
|
603
|
+
resolution: models.GetSupportResistanceLevelsResolution,
|
|
604
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
605
|
+
server_url: Optional[str] = None,
|
|
606
|
+
timeout_ms: Optional[int] = None,
|
|
607
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
608
|
+
) -> models.GetSupportResistanceLevelsResponse:
|
|
609
|
+
r"""Get Support & Resistance Levels
|
|
610
|
+
|
|
611
|
+
Retrieve calculated support and resistance price levels based on historical price action for identifying key trading zones.
|
|
612
|
+
|
|
613
|
+
If set, this operation will use `client_id` from the global security.
|
|
614
|
+
|
|
615
|
+
: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`.
|
|
616
|
+
:param resolution: How long each bar covers. Supported values are minutes (`1`, `5`, `15`, `30`, `60`) or daily/weekly/monthly (`D`, `W`, `M`). Other values return 400 Bad Request with error code `VALIDATION_ERROR`.
|
|
617
|
+
:param retries: Override the default retry configuration for this method
|
|
618
|
+
:param server_url: Override the default server URL for this method
|
|
619
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
620
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
621
|
+
"""
|
|
622
|
+
base_url = None
|
|
623
|
+
url_variables = None
|
|
624
|
+
if timeout_ms is None:
|
|
625
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
626
|
+
|
|
627
|
+
if timeout_ms is None:
|
|
628
|
+
timeout_ms = 30000
|
|
629
|
+
|
|
630
|
+
if server_url is not None:
|
|
631
|
+
base_url = server_url
|
|
632
|
+
else:
|
|
633
|
+
base_url = self._get_url(base_url, url_variables)
|
|
634
|
+
|
|
635
|
+
request = models.GetSupportResistanceLevelsRequest(
|
|
636
|
+
symbol=symbol,
|
|
637
|
+
resolution=resolution,
|
|
638
|
+
)
|
|
639
|
+
|
|
640
|
+
req = self._build_request(
|
|
641
|
+
method="GET",
|
|
642
|
+
path="/v1/scan/support-resistance",
|
|
643
|
+
base_url=base_url,
|
|
644
|
+
url_variables=url_variables,
|
|
645
|
+
request=request,
|
|
646
|
+
request_body_required=False,
|
|
647
|
+
request_has_path_params=False,
|
|
648
|
+
request_has_query_params=True,
|
|
649
|
+
user_agent_header="user-agent",
|
|
650
|
+
accept_header_value="application/json",
|
|
651
|
+
http_headers=http_headers,
|
|
652
|
+
security=self.sdk_configuration.security,
|
|
653
|
+
allow_empty_value=None,
|
|
654
|
+
allowed_fields=["client_id"],
|
|
655
|
+
timeout_ms=timeout_ms,
|
|
656
|
+
)
|
|
657
|
+
|
|
658
|
+
if retries == UNSET:
|
|
659
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
660
|
+
retries = self.sdk_configuration.retry_config
|
|
661
|
+
else:
|
|
662
|
+
retries = utils.RetryConfig(
|
|
663
|
+
"backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
|
|
664
|
+
)
|
|
665
|
+
|
|
666
|
+
retry_config = None
|
|
667
|
+
if isinstance(retries, utils.RetryConfig):
|
|
668
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
669
|
+
|
|
670
|
+
http_res = self.do_request(
|
|
671
|
+
hook_ctx=HookContext(
|
|
672
|
+
config=self.sdk_configuration,
|
|
673
|
+
base_url=base_url or "",
|
|
674
|
+
operation_id="getSupportResistanceLevels",
|
|
675
|
+
oauth2_scopes=["market:supplemental"],
|
|
676
|
+
security_source=self.sdk_configuration.security,
|
|
677
|
+
tags=["Technical Analysis"],
|
|
678
|
+
extensions=None,
|
|
679
|
+
),
|
|
680
|
+
request=req,
|
|
681
|
+
is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
|
|
682
|
+
retry_config=retry_config,
|
|
683
|
+
)
|
|
684
|
+
|
|
685
|
+
response_data: Any = None
|
|
686
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
687
|
+
return models.GetSupportResistanceLevelsResponse(
|
|
688
|
+
support_resistance_levels_response=unmarshal_json_response(
|
|
689
|
+
Optional[models.SupportResistanceLevelsResponse], http_res
|
|
690
|
+
),
|
|
691
|
+
http_meta=models.HTTPMetadata(request=req, response=http_res),
|
|
692
|
+
)
|
|
693
|
+
if utils.match_response(http_res, "400", "application/json"):
|
|
694
|
+
response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
|
|
695
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
696
|
+
request=req, response=http_res
|
|
697
|
+
)
|
|
698
|
+
raise errors.BadRequest(response_data, http_res)
|
|
699
|
+
if utils.match_response(http_res, "401", "application/json"):
|
|
700
|
+
response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
|
|
701
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
702
|
+
request=req, response=http_res
|
|
703
|
+
)
|
|
704
|
+
raise errors.Unauthorized(response_data, http_res)
|
|
705
|
+
if utils.match_response(http_res, "403", "application/json"):
|
|
706
|
+
response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
|
|
707
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
708
|
+
request=req, response=http_res
|
|
709
|
+
)
|
|
710
|
+
raise errors.Forbidden(response_data, http_res)
|
|
711
|
+
if utils.match_response(http_res, "404", "application/json"):
|
|
712
|
+
response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
|
|
713
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
714
|
+
request=req, response=http_res
|
|
715
|
+
)
|
|
716
|
+
raise errors.NotFound(response_data, http_res)
|
|
717
|
+
if utils.match_response(http_res, "500", "application/json"):
|
|
718
|
+
response_data = unmarshal_json_response(
|
|
719
|
+
errors.InternalServerErrorUnion, http_res
|
|
720
|
+
)
|
|
721
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
722
|
+
request=req, response=http_res
|
|
723
|
+
)
|
|
724
|
+
raise errors.InternalServerError(response_data, http_res)
|
|
725
|
+
if utils.match_response(http_res, "4XX", "*"):
|
|
726
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
727
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
728
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
729
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
730
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
731
|
+
|
|
732
|
+
raise errors.APIError("Unexpected response received", http_res)
|
|
733
|
+
|
|
734
|
+
async def get_support_resistance_levels_async(
|
|
735
|
+
self,
|
|
736
|
+
*,
|
|
737
|
+
symbol: str,
|
|
738
|
+
resolution: models.GetSupportResistanceLevelsResolution,
|
|
739
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
740
|
+
server_url: Optional[str] = None,
|
|
741
|
+
timeout_ms: Optional[int] = None,
|
|
742
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
743
|
+
) -> models.GetSupportResistanceLevelsResponse:
|
|
744
|
+
r"""Get Support & Resistance Levels
|
|
745
|
+
|
|
746
|
+
Retrieve calculated support and resistance price levels based on historical price action for identifying key trading zones.
|
|
747
|
+
|
|
748
|
+
If set, this operation will use `client_id` from the global security.
|
|
749
|
+
|
|
750
|
+
: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`.
|
|
751
|
+
:param resolution: How long each bar covers. Supported values are minutes (`1`, `5`, `15`, `30`, `60`) or daily/weekly/monthly (`D`, `W`, `M`). Other values return 400 Bad Request with error code `VALIDATION_ERROR`.
|
|
752
|
+
:param retries: Override the default retry configuration for this method
|
|
753
|
+
:param server_url: Override the default server URL for this method
|
|
754
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
755
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
756
|
+
"""
|
|
757
|
+
base_url = None
|
|
758
|
+
url_variables = None
|
|
759
|
+
if timeout_ms is None:
|
|
760
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
761
|
+
|
|
762
|
+
if timeout_ms is None:
|
|
763
|
+
timeout_ms = 30000
|
|
764
|
+
|
|
765
|
+
if server_url is not None:
|
|
766
|
+
base_url = server_url
|
|
767
|
+
else:
|
|
768
|
+
base_url = self._get_url(base_url, url_variables)
|
|
769
|
+
|
|
770
|
+
request = models.GetSupportResistanceLevelsRequest(
|
|
771
|
+
symbol=symbol,
|
|
772
|
+
resolution=resolution,
|
|
773
|
+
)
|
|
774
|
+
|
|
775
|
+
req = self._build_request_async(
|
|
776
|
+
method="GET",
|
|
777
|
+
path="/v1/scan/support-resistance",
|
|
778
|
+
base_url=base_url,
|
|
779
|
+
url_variables=url_variables,
|
|
780
|
+
request=request,
|
|
781
|
+
request_body_required=False,
|
|
782
|
+
request_has_path_params=False,
|
|
783
|
+
request_has_query_params=True,
|
|
784
|
+
user_agent_header="user-agent",
|
|
785
|
+
accept_header_value="application/json",
|
|
786
|
+
http_headers=http_headers,
|
|
787
|
+
security=self.sdk_configuration.security,
|
|
788
|
+
allow_empty_value=None,
|
|
789
|
+
allowed_fields=["client_id"],
|
|
790
|
+
timeout_ms=timeout_ms,
|
|
791
|
+
)
|
|
792
|
+
|
|
793
|
+
if retries == UNSET:
|
|
794
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
795
|
+
retries = self.sdk_configuration.retry_config
|
|
796
|
+
else:
|
|
797
|
+
retries = utils.RetryConfig(
|
|
798
|
+
"backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
|
|
799
|
+
)
|
|
800
|
+
|
|
801
|
+
retry_config = None
|
|
802
|
+
if isinstance(retries, utils.RetryConfig):
|
|
803
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
804
|
+
|
|
805
|
+
http_res = await self.do_request_async(
|
|
806
|
+
hook_ctx=HookContext(
|
|
807
|
+
config=self.sdk_configuration,
|
|
808
|
+
base_url=base_url or "",
|
|
809
|
+
operation_id="getSupportResistanceLevels",
|
|
810
|
+
oauth2_scopes=["market:supplemental"],
|
|
811
|
+
security_source=self.sdk_configuration.security,
|
|
812
|
+
tags=["Technical Analysis"],
|
|
813
|
+
extensions=None,
|
|
814
|
+
),
|
|
815
|
+
request=req,
|
|
816
|
+
is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
|
|
817
|
+
retry_config=retry_config,
|
|
818
|
+
)
|
|
819
|
+
|
|
820
|
+
response_data: Any = None
|
|
821
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
822
|
+
return models.GetSupportResistanceLevelsResponse(
|
|
823
|
+
support_resistance_levels_response=unmarshal_json_response(
|
|
824
|
+
Optional[models.SupportResistanceLevelsResponse], http_res
|
|
825
|
+
),
|
|
826
|
+
http_meta=models.HTTPMetadata(request=req, response=http_res),
|
|
827
|
+
)
|
|
828
|
+
if utils.match_response(http_res, "400", "application/json"):
|
|
829
|
+
response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
|
|
830
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
831
|
+
request=req, response=http_res
|
|
832
|
+
)
|
|
833
|
+
raise errors.BadRequest(response_data, http_res)
|
|
834
|
+
if utils.match_response(http_res, "401", "application/json"):
|
|
835
|
+
response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
|
|
836
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
837
|
+
request=req, response=http_res
|
|
838
|
+
)
|
|
839
|
+
raise errors.Unauthorized(response_data, http_res)
|
|
840
|
+
if utils.match_response(http_res, "403", "application/json"):
|
|
841
|
+
response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
|
|
842
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
843
|
+
request=req, response=http_res
|
|
844
|
+
)
|
|
845
|
+
raise errors.Forbidden(response_data, http_res)
|
|
846
|
+
if utils.match_response(http_res, "404", "application/json"):
|
|
847
|
+
response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
|
|
848
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
849
|
+
request=req, response=http_res
|
|
850
|
+
)
|
|
851
|
+
raise errors.NotFound(response_data, http_res)
|
|
852
|
+
if utils.match_response(http_res, "500", "application/json"):
|
|
853
|
+
response_data = unmarshal_json_response(
|
|
854
|
+
errors.InternalServerErrorUnion, http_res
|
|
855
|
+
)
|
|
856
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
857
|
+
request=req, response=http_res
|
|
858
|
+
)
|
|
859
|
+
raise errors.InternalServerError(response_data, http_res)
|
|
860
|
+
if utils.match_response(http_res, "4XX", "*"):
|
|
861
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
862
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
863
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
864
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
865
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
866
|
+
|
|
867
|
+
raise errors.APIError("Unexpected response received", http_res)
|
|
868
|
+
|
|
869
|
+
def get_aggregate_technical_indicators(
|
|
870
|
+
self,
|
|
871
|
+
*,
|
|
872
|
+
symbol: str,
|
|
873
|
+
resolution: models.GetAggregateTechnicalIndicatorsResolution,
|
|
874
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
875
|
+
server_url: Optional[str] = None,
|
|
876
|
+
timeout_ms: Optional[int] = None,
|
|
877
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
878
|
+
) -> models.GetAggregateTechnicalIndicatorsResponse:
|
|
879
|
+
r"""Get Aggregate Technical Indicators
|
|
880
|
+
|
|
881
|
+
Retrieve aggregate technical indicator signals combining moving averages, oscillators, and momentum indicators for overall buy/sell recommendations.
|
|
882
|
+
|
|
883
|
+
If set, this operation will use `client_id` from the global security.
|
|
884
|
+
|
|
885
|
+
: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`.
|
|
886
|
+
:param resolution: How long each bar covers. Supported values are minutes (`1`, `5`, `15`, `30`, `60`) or daily/weekly/monthly (`D`, `W`, `M`). Other values return 400 Bad Request with error code `VALIDATION_ERROR`.
|
|
887
|
+
:param retries: Override the default retry configuration for this method
|
|
888
|
+
:param server_url: Override the default server URL for this method
|
|
889
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
890
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
891
|
+
"""
|
|
892
|
+
base_url = None
|
|
893
|
+
url_variables = None
|
|
894
|
+
if timeout_ms is None:
|
|
895
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
896
|
+
|
|
897
|
+
if timeout_ms is None:
|
|
898
|
+
timeout_ms = 30000
|
|
899
|
+
|
|
900
|
+
if server_url is not None:
|
|
901
|
+
base_url = server_url
|
|
902
|
+
else:
|
|
903
|
+
base_url = self._get_url(base_url, url_variables)
|
|
904
|
+
|
|
905
|
+
request = models.GetAggregateTechnicalIndicatorsRequest(
|
|
906
|
+
symbol=symbol,
|
|
907
|
+
resolution=resolution,
|
|
908
|
+
)
|
|
909
|
+
|
|
910
|
+
req = self._build_request(
|
|
911
|
+
method="GET",
|
|
912
|
+
path="/v1/scan/technical-indicator",
|
|
913
|
+
base_url=base_url,
|
|
914
|
+
url_variables=url_variables,
|
|
915
|
+
request=request,
|
|
916
|
+
request_body_required=False,
|
|
917
|
+
request_has_path_params=False,
|
|
918
|
+
request_has_query_params=True,
|
|
919
|
+
user_agent_header="user-agent",
|
|
920
|
+
accept_header_value="application/json",
|
|
921
|
+
http_headers=http_headers,
|
|
922
|
+
security=self.sdk_configuration.security,
|
|
923
|
+
allow_empty_value=None,
|
|
924
|
+
allowed_fields=["client_id"],
|
|
925
|
+
timeout_ms=timeout_ms,
|
|
926
|
+
)
|
|
927
|
+
|
|
928
|
+
if retries == UNSET:
|
|
929
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
930
|
+
retries = self.sdk_configuration.retry_config
|
|
931
|
+
else:
|
|
932
|
+
retries = utils.RetryConfig(
|
|
933
|
+
"backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
|
|
934
|
+
)
|
|
935
|
+
|
|
936
|
+
retry_config = None
|
|
937
|
+
if isinstance(retries, utils.RetryConfig):
|
|
938
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
939
|
+
|
|
940
|
+
http_res = self.do_request(
|
|
941
|
+
hook_ctx=HookContext(
|
|
942
|
+
config=self.sdk_configuration,
|
|
943
|
+
base_url=base_url or "",
|
|
944
|
+
operation_id="getAggregateTechnicalIndicators",
|
|
945
|
+
oauth2_scopes=["market:supplemental"],
|
|
946
|
+
security_source=self.sdk_configuration.security,
|
|
947
|
+
tags=["Technical Analysis"],
|
|
948
|
+
extensions=None,
|
|
949
|
+
),
|
|
950
|
+
request=req,
|
|
951
|
+
is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
|
|
952
|
+
retry_config=retry_config,
|
|
953
|
+
)
|
|
954
|
+
|
|
955
|
+
response_data: Any = None
|
|
956
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
957
|
+
return models.GetAggregateTechnicalIndicatorsResponse(
|
|
958
|
+
aggregate_technical_indicators_response=unmarshal_json_response(
|
|
959
|
+
Optional[models.AggregateTechnicalIndicatorsResponse], http_res
|
|
960
|
+
),
|
|
961
|
+
http_meta=models.HTTPMetadata(request=req, response=http_res),
|
|
962
|
+
)
|
|
963
|
+
if utils.match_response(http_res, "400", "application/json"):
|
|
964
|
+
response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
|
|
965
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
966
|
+
request=req, response=http_res
|
|
967
|
+
)
|
|
968
|
+
raise errors.BadRequest(response_data, http_res)
|
|
969
|
+
if utils.match_response(http_res, "401", "application/json"):
|
|
970
|
+
response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
|
|
971
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
972
|
+
request=req, response=http_res
|
|
973
|
+
)
|
|
974
|
+
raise errors.Unauthorized(response_data, http_res)
|
|
975
|
+
if utils.match_response(http_res, "403", "application/json"):
|
|
976
|
+
response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
|
|
977
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
978
|
+
request=req, response=http_res
|
|
979
|
+
)
|
|
980
|
+
raise errors.Forbidden(response_data, http_res)
|
|
981
|
+
if utils.match_response(http_res, "404", "application/json"):
|
|
982
|
+
response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
|
|
983
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
984
|
+
request=req, response=http_res
|
|
985
|
+
)
|
|
986
|
+
raise errors.NotFound(response_data, http_res)
|
|
987
|
+
if utils.match_response(http_res, "500", "application/json"):
|
|
988
|
+
response_data = unmarshal_json_response(
|
|
989
|
+
errors.InternalServerErrorUnion, http_res
|
|
990
|
+
)
|
|
991
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
992
|
+
request=req, response=http_res
|
|
993
|
+
)
|
|
994
|
+
raise errors.InternalServerError(response_data, http_res)
|
|
995
|
+
if utils.match_response(http_res, "4XX", "*"):
|
|
996
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
997
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
998
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
999
|
+
http_res_text = utils.stream_to_text(http_res)
|
|
1000
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
1001
|
+
|
|
1002
|
+
raise errors.APIError("Unexpected response received", http_res)
|
|
1003
|
+
|
|
1004
|
+
async def get_aggregate_technical_indicators_async(
|
|
1005
|
+
self,
|
|
1006
|
+
*,
|
|
1007
|
+
symbol: str,
|
|
1008
|
+
resolution: models.GetAggregateTechnicalIndicatorsResolution,
|
|
1009
|
+
retries: OptionalNullable[utils.RetryConfig] = UNSET,
|
|
1010
|
+
server_url: Optional[str] = None,
|
|
1011
|
+
timeout_ms: Optional[int] = None,
|
|
1012
|
+
http_headers: Optional[Mapping[str, str]] = None,
|
|
1013
|
+
) -> models.GetAggregateTechnicalIndicatorsResponse:
|
|
1014
|
+
r"""Get Aggregate Technical Indicators
|
|
1015
|
+
|
|
1016
|
+
Retrieve aggregate technical indicator signals combining moving averages, oscillators, and momentum indicators for overall buy/sell recommendations.
|
|
1017
|
+
|
|
1018
|
+
If set, this operation will use `client_id` from the global security.
|
|
1019
|
+
|
|
1020
|
+
: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`.
|
|
1021
|
+
:param resolution: How long each bar covers. Supported values are minutes (`1`, `5`, `15`, `30`, `60`) or daily/weekly/monthly (`D`, `W`, `M`). Other values return 400 Bad Request with error code `VALIDATION_ERROR`.
|
|
1022
|
+
:param retries: Override the default retry configuration for this method
|
|
1023
|
+
:param server_url: Override the default server URL for this method
|
|
1024
|
+
:param timeout_ms: Override the default request timeout configuration for this method in milliseconds
|
|
1025
|
+
:param http_headers: Additional headers to set or replace on requests.
|
|
1026
|
+
"""
|
|
1027
|
+
base_url = None
|
|
1028
|
+
url_variables = None
|
|
1029
|
+
if timeout_ms is None:
|
|
1030
|
+
timeout_ms = self.sdk_configuration.timeout_ms
|
|
1031
|
+
|
|
1032
|
+
if timeout_ms is None:
|
|
1033
|
+
timeout_ms = 30000
|
|
1034
|
+
|
|
1035
|
+
if server_url is not None:
|
|
1036
|
+
base_url = server_url
|
|
1037
|
+
else:
|
|
1038
|
+
base_url = self._get_url(base_url, url_variables)
|
|
1039
|
+
|
|
1040
|
+
request = models.GetAggregateTechnicalIndicatorsRequest(
|
|
1041
|
+
symbol=symbol,
|
|
1042
|
+
resolution=resolution,
|
|
1043
|
+
)
|
|
1044
|
+
|
|
1045
|
+
req = self._build_request_async(
|
|
1046
|
+
method="GET",
|
|
1047
|
+
path="/v1/scan/technical-indicator",
|
|
1048
|
+
base_url=base_url,
|
|
1049
|
+
url_variables=url_variables,
|
|
1050
|
+
request=request,
|
|
1051
|
+
request_body_required=False,
|
|
1052
|
+
request_has_path_params=False,
|
|
1053
|
+
request_has_query_params=True,
|
|
1054
|
+
user_agent_header="user-agent",
|
|
1055
|
+
accept_header_value="application/json",
|
|
1056
|
+
http_headers=http_headers,
|
|
1057
|
+
security=self.sdk_configuration.security,
|
|
1058
|
+
allow_empty_value=None,
|
|
1059
|
+
allowed_fields=["client_id"],
|
|
1060
|
+
timeout_ms=timeout_ms,
|
|
1061
|
+
)
|
|
1062
|
+
|
|
1063
|
+
if retries == UNSET:
|
|
1064
|
+
if self.sdk_configuration.retry_config is not UNSET:
|
|
1065
|
+
retries = self.sdk_configuration.retry_config
|
|
1066
|
+
else:
|
|
1067
|
+
retries = utils.RetryConfig(
|
|
1068
|
+
"backoff", utils.BackoffStrategy(500, 8000, 1.5, 60000), True
|
|
1069
|
+
)
|
|
1070
|
+
|
|
1071
|
+
retry_config = None
|
|
1072
|
+
if isinstance(retries, utils.RetryConfig):
|
|
1073
|
+
retry_config = (retries, ["429", "500", "502", "503", "504"])
|
|
1074
|
+
|
|
1075
|
+
http_res = await self.do_request_async(
|
|
1076
|
+
hook_ctx=HookContext(
|
|
1077
|
+
config=self.sdk_configuration,
|
|
1078
|
+
base_url=base_url or "",
|
|
1079
|
+
operation_id="getAggregateTechnicalIndicators",
|
|
1080
|
+
oauth2_scopes=["market:supplemental"],
|
|
1081
|
+
security_source=self.sdk_configuration.security,
|
|
1082
|
+
tags=["Technical Analysis"],
|
|
1083
|
+
extensions=None,
|
|
1084
|
+
),
|
|
1085
|
+
request=req,
|
|
1086
|
+
is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
|
|
1087
|
+
retry_config=retry_config,
|
|
1088
|
+
)
|
|
1089
|
+
|
|
1090
|
+
response_data: Any = None
|
|
1091
|
+
if utils.match_response(http_res, "200", "application/json"):
|
|
1092
|
+
return models.GetAggregateTechnicalIndicatorsResponse(
|
|
1093
|
+
aggregate_technical_indicators_response=unmarshal_json_response(
|
|
1094
|
+
Optional[models.AggregateTechnicalIndicatorsResponse], http_res
|
|
1095
|
+
),
|
|
1096
|
+
http_meta=models.HTTPMetadata(request=req, response=http_res),
|
|
1097
|
+
)
|
|
1098
|
+
if utils.match_response(http_res, "400", "application/json"):
|
|
1099
|
+
response_data = unmarshal_json_response(errors.BadRequestUnion, http_res)
|
|
1100
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
1101
|
+
request=req, response=http_res
|
|
1102
|
+
)
|
|
1103
|
+
raise errors.BadRequest(response_data, http_res)
|
|
1104
|
+
if utils.match_response(http_res, "401", "application/json"):
|
|
1105
|
+
response_data = unmarshal_json_response(errors.UnauthorizedUnion, http_res)
|
|
1106
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
1107
|
+
request=req, response=http_res
|
|
1108
|
+
)
|
|
1109
|
+
raise errors.Unauthorized(response_data, http_res)
|
|
1110
|
+
if utils.match_response(http_res, "403", "application/json"):
|
|
1111
|
+
response_data = unmarshal_json_response(errors.ForbiddenUnion, http_res)
|
|
1112
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
1113
|
+
request=req, response=http_res
|
|
1114
|
+
)
|
|
1115
|
+
raise errors.Forbidden(response_data, http_res)
|
|
1116
|
+
if utils.match_response(http_res, "404", "application/json"):
|
|
1117
|
+
response_data = unmarshal_json_response(errors.NotFoundUnion, http_res)
|
|
1118
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
1119
|
+
request=req, response=http_res
|
|
1120
|
+
)
|
|
1121
|
+
raise errors.NotFound(response_data, http_res)
|
|
1122
|
+
if utils.match_response(http_res, "500", "application/json"):
|
|
1123
|
+
response_data = unmarshal_json_response(
|
|
1124
|
+
errors.InternalServerErrorUnion, http_res
|
|
1125
|
+
)
|
|
1126
|
+
response_data.http_meta = models.HTTPMetadata(
|
|
1127
|
+
request=req, response=http_res
|
|
1128
|
+
)
|
|
1129
|
+
raise errors.InternalServerError(response_data, http_res)
|
|
1130
|
+
if utils.match_response(http_res, "4XX", "*"):
|
|
1131
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
1132
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
1133
|
+
if utils.match_response(http_res, "5XX", "*"):
|
|
1134
|
+
http_res_text = await utils.stream_to_text_async(http_res)
|
|
1135
|
+
raise errors.APIError("API error occurred", http_res, http_res_text)
|
|
1136
|
+
|
|
1137
|
+
raise errors.APIError("Unexpected response received", http_res)
|