├── requirements.txt ├── fdnpy ├── __init__.py └── client.py ├── setup.py ├── README.md └── tests.py /requirements.txt: -------------------------------------------------------------------------------- 1 | requests>=2.25.0 -------------------------------------------------------------------------------- /fdnpy/__init__.py: -------------------------------------------------------------------------------- 1 | from .client import FinancialDataClient -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | setup( 4 | name='fdnpy', 5 | version='0.1.0', 6 | description='A Python SDK for FinancialData.Net API', 7 | url='https://github.com/financialdatanet/fdnpy', 8 | packages=find_packages(), 9 | classifiers=[ 10 | 'Programming Language :: Python :: 3', 11 | 'License :: OSI Approved :: MIT License', 12 | 'Operating System :: OS Independent', 13 | ], 14 | python_requires='>=3.6', 15 | install_requires=[ 16 | 'requests>=2.25.0', 17 | ], 18 | ) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # **fdnpy** 2 | 3 | Complete Python SDK for [FinancialData.Net](https://financialdata.net/) API 4 | 5 | ## **Installation** 6 | 7 | ``` 8 | pip install fdnpy 9 | ``` 10 | ## **Usage Example** 11 | 12 | ```python 13 | from fdnpy import FinancialDataClient 14 | 15 | # Replace 'YOUR_API_KEY' with your actual key 16 | client = FinancialDataClient(api_key='YOUR_API_KEY') 17 | 18 | # Get stock prices for Microsoft 19 | prices = client.get_stock_prices(identifier='MSFT') 20 | print(prices[0], end='\n\n') 21 | 22 | # Get Microsoft's balance sheet 23 | balance_sheet = client.get_balance_sheet_statements(identifier='MSFT', period='year') 24 | print(balance_sheet[0]) 25 | ``` 26 | -------------------------------------------------------------------------------- /tests.py: -------------------------------------------------------------------------------- 1 | import os 2 | import unittest 3 | from typing import List, Dict, Callable, Any 4 | from fdnpy import FinancialDataClient 5 | 6 | class TestFinancialDataClient(unittest.TestCase): 7 | 8 | test_kwargs = {'stock_quotes': {'identifiers': ['AAPL', 'MSFT']}, 9 | 'stock_prices': {'identifier': 'MSFT'}, 10 | 'international_stock_prices': {'identifier': 'SHEL.L'}, 11 | 'minute_prices': {'identifier': 'MSFT', 'date': '2020-01-15'}, 12 | 'latest_prices': {'identifier': 'MSFT'}, 13 | 'commodity_prices': {'identifier': 'ZC'}, 14 | 'otc_prices': {'identifier': 'AABB'}, 15 | 'otc_volume': {'identifier': 'AABB'}, 16 | 'index_quotes': {'identifiers': ['^GSPC', '^DJI']}, 17 | 'index_prices': {'identifier': '^GSPC'}, 18 | 'index_constituents': {'identifier': '^GSPC'}, 19 | 'option_chain' : {'identifier': 'MSFT'}, 20 | 'option_prices': {'identifier': 'MSFT250417C00400000'}, 21 | 'option_greeks': {'identifier': 'MSFT250417C00400000'}, 22 | 'futures_prices': {'identifier': 'ZN'}, 23 | 'crypto_information': {'identifier': 'BTC'}, 24 | 'crypto_quotes': {'identifiers': ['BTCUSD', 'ETHUSD']}, 25 | 'crypto_prices': {'identifier': 'BTCUSD'}, 26 | 'crypto_minute_prices': {'identifier': 'BTCUSD', 'date': '2025-01-15'}, 27 | 'company_information': {'identifier': 'MSFT'}, 28 | 'international_company_information': {'identifier': 'SHEL.L'}, 29 | 'key_metrics': {'identifier': 'MSFT'}, 30 | 'market_cap': {'identifier': 'MSFT'}, 31 | 'employee_count': {'identifier': 'MSFT'}, 32 | 'executive_compensation': {'identifier': 'MSFT'}, 33 | 'securities_information': {'identifier': 'MSFT'}, 34 | 'income_statements': {'identifier': 'MSFT', 'period': 'year'}, 35 | 'balance_sheet_statements': {'identifier': 'MSFT', 'period': 'year'}, 36 | 'cash_flow_statements': {'identifier': 'MSFT', 'period': 'year'}, 37 | 'international_income_statements': {'identifier': 'SHEL.L', 'period': 'year'}, 38 | 'international_balance_sheet_statements': {'identifier': 'SHEL.L', 'period': 'year'}, 39 | 'international_cash_flow_statements': {'identifier': 'SHEL.L', 'period': 'year'}, 40 | 'liquidity_ratios': {'identifier': 'MSFT', 'period': 'year'}, 41 | 'solvency_ratios': {'identifier': 'MSFT', 'period': 'year'}, 42 | 'efficiency_ratios': {'identifier': 'MSFT', 'period': 'year'}, 43 | 'profitability_ratios': {'identifier': 'MSFT', 'period': 'year'}, 44 | 'valuation_ratios': {'identifier': 'MSFT', 'period': 'year'}, 45 | 'earnings_calendar': {'date': '2025-10-31'}, 46 | 'ipo_calendar': {'date': '2025-10-31'}, 47 | 'splits_calendar': {'date': '2025-10-29'}, 48 | 'dividends_calendar': {'date': '2025-10-29'}, 49 | 'economic_calendar': {'date': '2025-10-19'}, 50 | 'insider_transactions': {'identifier': 'MSFT'}, 51 | 'proposed_sales': {'identifier': 'MSFT'}, 52 | 'senate_trading': {'identifier': 'MSFT'}, 53 | 'house_trading': {'identifier': 'MSFT'}, 54 | 'institutional_holdings': {'identifier': 'MSFT'}, 55 | 'institutional_portfolio_statistics': {'identifier': '0000102909'}, 56 | 'etf_quotes': {'identifiers': ['SPY', 'QQQ']}, 57 | 'etf_prices': {'identifier': 'SPY'}, 58 | 'etf_holdings': {'identifier': 'SPY'}, 59 | 'mutual_fund_holdings': {'identifier': 'VTSAX'}, 60 | 'mutual_fund_statistics': {'identifier': 'VTSAX'}, 61 | 'esg_scores': {'identifier': 'MSFT'}, 62 | 'esg_ratings': {'identifier': 'MSFT'}, 63 | 'industry_esg_scores': {'date': '2025-01-01'}, 64 | 'investment_adviser_information': {'identifier': 'BLACKROCK INVESTMENT MANAGEMENT, LLC'}, 65 | 'earnings_releases': {'identifier': 'MSFT'}, 66 | 'initial_public_offerings': {'identifier': 'ABNB'}, 67 | 'stock_splits': {'identifier': 'MSFT'}, 68 | 'dividends': {'identifier': 'MSFT'}, 69 | 'short_interest': {'identifier': 'MSFT'}} 70 | 71 | @classmethod 72 | def get_method_names(cls) -> List[str]: 73 | 74 | method_names = [] 75 | for name in dir(FinancialDataClient): 76 | if not name.startswith('__') and name not in ['make_request', 'get_data']: 77 | attr = getattr(FinancialDataClient, name) 78 | if callable(attr): 79 | method_names.append(name) 80 | 81 | assert len(method_names) == 73 82 | 83 | return sorted(method_names) 84 | 85 | @classmethod 86 | def create_test_method(cls, method_name: str) -> Callable: 87 | 88 | def test(self): 89 | 90 | key = method_name.split('_', 1)[1] 91 | kwargs = self.test_kwargs.get(key, {}) 92 | print('Testing %s with kwargs: %s' % (method_name, kwargs)) 93 | 94 | try: 95 | method = getattr(self.client, method_name) 96 | result = method(**kwargs) 97 | self.assertIsInstance(result, list, 'Result for %s is not a list' % method_name) 98 | 99 | if result: 100 | self.assertIsInstance(result[0], dict, 'Elements in %s result are not dictionaries' % method_name) 101 | print('SUCCESS: %s returned %d records' % (method_name, len(result))) 102 | else: 103 | self.fail('%s returned an empty list' % method_name) 104 | 105 | except Exception as e: 106 | self.fail('Unexpected exception for %s: %s' % (method_name, e)) 107 | 108 | test.__name__ = 'test_%s' % method_name 109 | return test 110 | 111 | @classmethod 112 | def initialize(cls): 113 | 114 | api_key = os.environ.get('FINANCIAL_DATA_API_KEY', None) 115 | if api_key is None: 116 | unittest.SkipTest('API key not set, skipping tests') 117 | 118 | cls.client = FinancialDataClient(api_key=api_key) 119 | method_names = cls.get_method_names() 120 | 121 | for method_name in method_names: 122 | test_method = cls.create_test_method(method_name) 123 | setattr(cls, test_method.__name__, test_method) 124 | 125 | TestFinancialDataClient.initialize() 126 | if __name__ == '__main__': 127 | print('Starting API Tests...') 128 | unittest.main() 129 | 130 | -------------------------------------------------------------------------------- /fdnpy/client.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import time 3 | import requests 4 | from datetime import timedelta 5 | from typing import List, Dict, Any 6 | 7 | class FinancialDataClient: 8 | 9 | def __init__(self, api_key: str) -> Any: 10 | 11 | self.base_url = 'https://financialdata.net/api/v1/' 12 | self.api_key = api_key 13 | self.session = requests.Session() 14 | 15 | def make_request(self, endpoint: str, params: Dict[str, Any]) -> List[Dict]: 16 | 17 | params['key'] = self.api_key 18 | url = self.base_url + endpoint 19 | 20 | backoff = 1 21 | while 1: 22 | try: 23 | response = self.session.get(url, params=params) 24 | response.raise_for_status() 25 | return response.json() 26 | 27 | except Exception as e: 28 | if response.status_code in [429, 500, 503]: 29 | print('%s\nRetrying after %s' % (e, timedelta(seconds=backoff))) 30 | time.sleep(backoff) 31 | backoff *= 2 32 | else: 33 | raise e 34 | 35 | def get_data(self, endpoint: str, params: Dict[str, Any] = None, limit: int = sys.maxsize) -> List[Dict]: 36 | 37 | params = params or {} 38 | params['offset'] = 0 39 | 40 | data = [] 41 | while 1: 42 | partial_data = self.make_request(endpoint, params) 43 | data.extend(partial_data) 44 | count = len(partial_data) 45 | 46 | if count < limit: 47 | break 48 | else: 49 | params['offset'] += limit 50 | 51 | return data 52 | 53 | # ========================================== 54 | # Symbol Lists 55 | # ========================================== 56 | 57 | def get_stock_symbols(self) -> List[Dict]: 58 | 59 | return self.get_data('stock-symbols', limit=500) 60 | 61 | def get_international_stock_symbols(self) -> List[Dict]: 62 | 63 | return self.get_data('international-stock-symbols', limit=500) 64 | 65 | def get_etf_symbols(self) -> List[Dict]: 66 | 67 | return self.get_data('etf-symbols', limit=500) 68 | 69 | def get_commodity_symbols(self) -> List[Dict]: 70 | 71 | return self.get_data('commodity-symbols') 72 | 73 | def get_otc_symbols(self) -> List[Dict]: 74 | 75 | return self.get_data('otc-symbols', limit=500) 76 | 77 | # ========================================== 78 | # Market Data 79 | # ========================================== 80 | 81 | def get_stock_quotes(self, identifiers: List[str]) -> List[Dict]: 82 | 83 | params = {'identifiers': ','.join(identifiers)} 84 | return self.get_data('stock-quotes', params=params, limit=300) 85 | 86 | def get_stock_prices(self, identifier: str) -> List[Dict]: 87 | 88 | params = {'identifier': identifier} 89 | return self.get_data('stock-prices', params=params, limit=300) 90 | 91 | def get_international_stock_prices(self, identifier: str) -> List[Dict]: 92 | 93 | params = {'identifier': identifier} 94 | return self.get_data('international-stock-prices', params=params, limit=300) 95 | 96 | def get_minute_prices(self, identifier: str, date: str) -> List[Dict]: 97 | 98 | params = {'identifier': identifier, 'date': date} 99 | return self.get_data('minute-prices', params=params, limit=300) 100 | 101 | def get_latest_prices(self, identifier: str) -> List[Dict]: 102 | 103 | params = {'identifier': identifier} 104 | return self.get_data('latest-prices', params=params, limit=300) 105 | 106 | def get_commodity_prices(self, identifier: str) -> List[Dict]: 107 | 108 | params = {'identifier': identifier} 109 | return self.get_data('commodity-prices', params=params, limit=300) 110 | 111 | def get_otc_prices(self, identifier: str) -> List[Dict]: 112 | 113 | params = {'identifier': identifier} 114 | return self.get_data('otc-prices', params=params, limit=300) 115 | 116 | def get_otc_volume(self, identifier: str) -> List[Dict]: 117 | 118 | params = {'identifier': identifier} 119 | return self.get_data('otc-volume', params=params) 120 | 121 | # ========================================== 122 | # Market Indexes 123 | # ========================================== 124 | 125 | def get_index_symbols(self) -> List[Dict]: 126 | 127 | return self.get_data('index-symbols') 128 | 129 | def get_index_quotes(self, identifiers: List[str]) -> List[Dict]: 130 | 131 | params = {'identifiers': ','.join(identifiers)} 132 | return self.get_data('index-quotes', params=params, limit=300) 133 | 134 | def get_index_prices(self, identifier: str) -> List[Dict]: 135 | 136 | params = {'identifier': identifier} 137 | return self.get_data('index-prices', params=params, limit=300) 138 | 139 | def get_index_constituents(self, identifier: str) -> List[Dict]: 140 | 141 | params = {'identifier': identifier} 142 | return self.get_data('index-constituents', params=params, limit=300) 143 | 144 | # ========================================== 145 | # Derivatives Data 146 | # ========================================== 147 | 148 | def get_option_chain(self, identifier: str) -> List[Dict]: 149 | 150 | params = {'identifier': identifier} 151 | return self.get_data('option-chain', params=params, limit=300) 152 | 153 | def get_option_prices(self, identifier: str) -> List[Dict]: 154 | 155 | params = {'identifier': identifier} 156 | return self.get_data('option-prices', params=params, limit=300) 157 | 158 | def get_option_greeks(self, identifier: str) -> List[Dict]: 159 | 160 | params = {'identifier': identifier} 161 | return self.get_data('option-greeks', params=params, limit=300) 162 | 163 | def get_futures_symbols(self) -> List[Dict]: 164 | 165 | return self.get_data('futures-symbols', limit=500) 166 | 167 | def get_futures_prices(self, identifier: str) -> List[Dict]: 168 | 169 | params = {'identifier': identifier} 170 | return self.get_data('futures-prices', params=params, limit=300) 171 | 172 | # ========================================== 173 | # Crypto Currencies 174 | # ========================================== 175 | 176 | def get_crypto_symbols(self) -> List[Dict]: 177 | 178 | return self.get_data('crypto-symbols', limit=500) 179 | 180 | def get_crypto_information(self, identifier: str) -> List[Dict]: 181 | 182 | params = {'identifier': identifier} 183 | return self.get_data('crypto-information', params=params) 184 | 185 | def get_crypto_quotes(self, identifiers: List[str]) -> List[Dict]: 186 | 187 | params = {'identifiers': ','.join(identifiers)} 188 | return self.get_data('crypto-quotes', params=params, limit=300) 189 | 190 | def get_crypto_prices(self, identifier: str) -> List[Dict]: 191 | 192 | params = {'identifier': identifier} 193 | return self.get_data('crypto-prices', params=params, limit=300) 194 | 195 | def get_crypto_minute_prices(self, identifier: str, date: str) -> List[Dict]: 196 | 197 | params = {'identifier': identifier, 'date': date} 198 | return self.get_data('crypto-minute-prices', params=params, limit=300) 199 | 200 | # ========================================== 201 | # Basic Information 202 | # ========================================== 203 | 204 | def get_company_information(self, identifier: str) -> List[Dict]: 205 | 206 | params = {'identifier': identifier} 207 | return self.get_data('company-information', params=params) 208 | 209 | def get_international_company_information(self, identifier: str) -> List[Dict]: 210 | 211 | params = {'identifier': identifier} 212 | return self.get_data('international-company-information', params=params) 213 | 214 | def get_key_metrics(self, identifier: str) -> List[Dict]: 215 | 216 | params = {'identifier': identifier} 217 | return self.get_data('key-metrics', params=params) 218 | 219 | def get_market_cap(self, identifier: str) -> List[Dict]: 220 | 221 | params = {'identifier': identifier} 222 | return self.get_data('market-cap', params=params) 223 | 224 | def get_employee_count(self, identifier: str) -> List[Dict]: 225 | 226 | params = {'identifier': identifier} 227 | return self.get_data('employee-count', params=params) 228 | 229 | def get_executive_compensation(self, identifier: str) -> List[Dict]: 230 | 231 | params = {'identifier': identifier} 232 | return self.get_data('executive-compensation', params=params, limit=100) 233 | 234 | def get_securities_information(self, identifier: str) -> List[Dict]: 235 | 236 | params = {'identifier': identifier} 237 | return self.get_data('securities-information', params=params) 238 | 239 | # ========================================== 240 | # Financial Statements 241 | # ========================================== 242 | 243 | def get_income_statements(self, identifier: str, period: str = None) -> List[Dict]: 244 | 245 | params = {'identifier': identifier} if period is None else {'identifier': identifier, 'period': period} 246 | return self.get_data('income-statements', params=params, limit=50) 247 | 248 | def get_balance_sheet_statements(self, identifier: str, period: str = None) -> List[Dict]: 249 | 250 | params = {'identifier': identifier} if period is None else {'identifier': identifier, 'period': period} 251 | return self.get_data('balance-sheet-statements', params=params, limit=50) 252 | 253 | def get_cash_flow_statements(self, identifier: str, period: str = None) -> List[Dict]: 254 | 255 | params = {'identifier': identifier} if period is None else {'identifier': identifier, 'period': period} 256 | return self.get_data('cash-flow-statements', params=params, limit=50) 257 | 258 | def get_international_income_statements(self, identifier: str, period: str = None) -> List[Dict]: 259 | 260 | params = {'identifier': identifier} if period is None else {'identifier': identifier, 'period': period} 261 | return self.get_data('international-income-statements', params=params, limit=50) 262 | 263 | def get_international_balance_sheet_statements(self, identifier: str, period: str = None) -> List[Dict]: 264 | 265 | params = {'identifier': identifier} if period is None else {'identifier': identifier, 'period': period} 266 | return self.get_data('international-balance-sheet-statements', params=params, limit=50) 267 | 268 | def get_international_cash_flow_statements(self, identifier: str, period: str = None) -> List[Dict]: 269 | 270 | params = {'identifier': identifier} if period is None else {'identifier': identifier, 'period': period} 271 | return self.get_data('international-cash-flow-statements', params=params, limit=50) 272 | 273 | # ========================================== 274 | # Financial Ratios 275 | # ========================================== 276 | 277 | def get_liquidity_ratios(self, identifier: str, period: str = None) -> List[Dict]: 278 | 279 | params = {'identifier': identifier} if period is None else {'identifier': identifier, 'period': period} 280 | return self.get_data('liquidity-ratios', params=params, limit=50) 281 | 282 | def get_solvency_ratios(self, identifier: str, period: str = None) -> List[Dict]: 283 | 284 | params = {'identifier': identifier} if period is None else {'identifier': identifier, 'period': period} 285 | return self.get_data('solvency-ratios', params=params, limit=50) 286 | 287 | def get_efficiency_ratios(self, identifier: str, period: str = None) -> List[Dict]: 288 | 289 | params = {'identifier': identifier} if period is None else {'identifier': identifier, 'period': period} 290 | return self.get_data('efficiency-ratios', params=params, limit=50) 291 | 292 | def get_profitability_ratios(self, identifier: str, period: str = None) -> List[Dict]: 293 | 294 | params = {'identifier': identifier} if period is None else {'identifier': identifier, 'period': period} 295 | return self.get_data('profitability-ratios', params=params, limit=50) 296 | 297 | def get_valuation_ratios(self, identifier: str, period: str = None) -> List[Dict]: 298 | 299 | params = {'identifier': identifier} if period is None else {'identifier': identifier, 'period': period} 300 | return self.get_data('valuation-ratios', params=params, limit=50) 301 | 302 | # ========================================== 303 | # Event Calendars 304 | # ========================================== 305 | 306 | def get_earnings_calendar(self, date: str) -> List[Dict]: 307 | 308 | params = {'date': date} 309 | return self.get_data('earnings-calendar', params=params, limit=300) 310 | 311 | def get_ipo_calendar(self, date: str) -> List[Dict]: 312 | 313 | params = {'date': date} 314 | return self.get_data('ipo-calendar', params=params) 315 | 316 | def get_splits_calendar(self, date: str) -> List[Dict]: 317 | 318 | params = {'date': date} 319 | return self.get_data('splits-calendar', params=params) 320 | 321 | def get_dividends_calendar(self, date: str) -> List[Dict]: 322 | 323 | params = {'date': date} 324 | return self.get_data('dividends-calendar', params=params) 325 | 326 | def get_economic_calendar(self, date: str) -> List[Dict]: 327 | 328 | params = {'date': date} 329 | return self.get_data('economic-calendar', params=params, limit=300) 330 | 331 | # ========================================== 332 | # Insider Trading 333 | # ========================================== 334 | 335 | def get_insider_transactions(self, identifier: str) -> List[Dict]: 336 | 337 | params = {'identifier': identifier} 338 | return self.get_data('insider-transactions', params=params, limit=50) 339 | 340 | def get_proposed_sales(self, identifier: str) -> List[Dict]: 341 | 342 | params = {'identifier': identifier} 343 | return self.get_data('proposed-sales', params=params, limit=100) 344 | 345 | def get_senate_trading(self, identifier: str) -> List[Dict]: 346 | 347 | params = {'identifier': identifier} 348 | return self.get_data('senate-trading', params=params, limit=100) 349 | 350 | def get_house_trading(self, identifier: str) -> List[Dict]: 351 | 352 | params = {'identifier': identifier} 353 | return self.get_data('house-trading', params=params, limit=100) 354 | 355 | # ========================================== 356 | # Institutional Trading 357 | # ========================================== 358 | 359 | def get_institutional_investors(self) -> List[Dict]: 360 | 361 | return self.get_data('institutional-investors', limit=500) 362 | 363 | def get_institutional_holdings(self, identifier: str) -> List[Dict]: 364 | 365 | params = {'identifier': identifier} 366 | return self.get_data('institutional-holdings', params=params, limit=100) 367 | 368 | def get_institutional_portfolio_statistics(self, identifier: str) -> List[Dict]: 369 | 370 | params = {'identifier': identifier} 371 | return self.get_data('institutional-portfolio-statistics', params=params, limit=50) 372 | 373 | # ========================================== 374 | # ETF Data 375 | # ========================================== 376 | 377 | def get_etf_quotes(self, identifiers: List[str]) -> List[Dict]: 378 | 379 | params = {'identifiers': ','.join(identifiers)} 380 | return self.get_data('etf-quotes', params=params, limit=300) 381 | 382 | def get_etf_prices(self, identifier: str) -> List[Dict]: 383 | 384 | params = {'identifier': identifier} 385 | return self.get_data('etf-prices', params=params, limit=300) 386 | 387 | def get_etf_holdings(self, identifier: str) -> List[Dict]: 388 | 389 | params = {'identifier': identifier} 390 | return self.get_data('etf-holdings', params=params, limit=50) 391 | 392 | # ========================================== 393 | # Mutual Funds 394 | # ========================================== 395 | 396 | def get_mutual_fund_symbols(self) -> List[Dict]: 397 | 398 | return self.get_data('mutual-fund-symbols', limit=500) 399 | 400 | def get_mutual_fund_holdings(self, identifier: str) -> List[Dict]: 401 | 402 | params = {'identifier': identifier} 403 | return self.get_data('mutual-fund-holdings', params=params, limit=50) 404 | 405 | def get_mutual_fund_statistics(self, identifier: str) -> List[Dict]: 406 | 407 | params = {'identifier': identifier} 408 | return self.get_data('mutual-fund-statistics', params=params, limit=50) 409 | 410 | # ========================================== 411 | # ESG Data 412 | # ========================================== 413 | 414 | def get_esg_scores(self, identifier: str) -> List[Dict]: 415 | 416 | params = {'identifier': identifier} 417 | return self.get_data('esg-scores', params=params) 418 | 419 | def get_esg_ratings(self, identifier: str) -> List[Dict]: 420 | 421 | params = {'identifier': identifier} 422 | return self.get_data('esg-ratings', params=params) 423 | 424 | def get_industry_esg_scores(self, date: str) -> List[Dict]: 425 | 426 | params = {'date': date} 427 | return self.get_data('industry-esg-scores', params=params) 428 | 429 | # ========================================== 430 | # Investment Advisers 431 | # ========================================== 432 | 433 | def get_investment_adviser_names(self) -> List[Dict]: 434 | 435 | return self.get_data('investment-adviser-names', limit=1000) 436 | 437 | def get_investment_adviser_information(self, identifier: str) -> List[Dict]: 438 | 439 | params = {'identifier': identifier} 440 | return self.get_data('investment-adviser-information', params=params) 441 | 442 | # ========================================== 443 | # Miscellaneous Data 444 | # ========================================== 445 | 446 | def get_earnings_releases(self, identifier: str) -> List[Dict]: 447 | 448 | params = {'identifier': identifier} 449 | return self.get_data('earnings-releases', params=params) 450 | 451 | def get_initial_public_offerings(self, identifier: str) -> List[Dict]: 452 | 453 | params = {'identifier': identifier} 454 | return self.get_data('initial-public-offerings', params=params) 455 | 456 | def get_stock_splits(self, identifier: str) -> List[Dict]: 457 | 458 | params = {'identifier': identifier} 459 | return self.get_data('stock-splits', params=params) 460 | 461 | def get_dividends(self, identifier: str) -> List[Dict]: 462 | 463 | params = {'identifier': identifier} 464 | return self.get_data('dividends', params=params) 465 | 466 | def get_short_interest(self, identifier: str) -> List[Dict]: 467 | 468 | params = {'identifier': identifier} 469 | return self.get_data('short-interest', params=params, limit=100) --------------------------------------------------------------------------------