Module fmp

Financial Modeling Prep API Wrapper.

An API key is needed and may be obtained at the FMP website.

The package may be installed with the command:

pip install fmp_api_python
Expand source code
"""Financial Modeling Prep API Wrapper.

An API key is needed and may be obtained at the [FMP website](https://site.financialmodelingprep.com/).

The package may be installed with the command: 
```
pip install fmp_api_python
```
"""


from http.client import OK, TOO_MANY_REQUESTS
import requests
import os
import csv
import pandas as pd

from fmp_api_python.constants import BASE_URL_V3, BASE_URL_V4
from fmp_api_python.constants import TODAY


class TooManyRequestsException(requests.RequestException):
    """Raised when a 429 too many requests error was returned by the API."""
    
    def __init__(self):
        super().__init__('The FMP API rate limit was exceeded')


class FMPClient:
    """Python wrapper for the Financial Modeling Prep (FMP) API.
    
    Makes call requests to the FMP API and returns the results. Currently, 
    only some of the endpoints under the personal plan are implemented, and none 
    from the professional or enterprise versions. Most requests can have the response
    be formatted either in the original json or as a pandas.DataFrame, although 
    some enpoints do not have support for a DataFrame return.

    In order to use the API, an API key must be used. This can either be passed into 
    the constructor or added to the environmental variables under the name FMP_API_KEY.

    Args:
        api_key (str): FMP API key.
    """

    def __init__(self, api_key=None):
        self._api_key = api_key or os.getenv('FMP_API_KEY')
        self._empty_payload = {
            'apikey': self._api_key
        }

    def _process_response(self, response, response_type, return_type):
        """Converts the response from the API into the given response type.
        
        Args:
            response (requests.models.response): API response from the requests.get method.
            response_type (str): 'json' | 'csv' depending on the type of API response.
            return_type (str): 'json' | 'df' depending on the desired return format.

        Returns: 
            Either a list or pandas.DataFrame with the response content.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        if (response.status_code == TOO_MANY_REQUESTS):
            raise TooManyRequestsException()
        elif (response.status_code != OK):
            raise requests.RequestException()

        if (response_type == 'json'):
            content = response.json()

            if (return_type == 'json'):
                return content
            elif (return_type == 'df'):
                return pd.DataFrame(content)

        elif (response_type == 'csv'):
            content = list(csv.reader(response.content.decode('utf-8').splitlines(), delimiter=','))

            if (return_type == 'df'):
                df = pd.DataFrame(list(content))
                df = df.rename(columns=df.iloc[0], inplace=False).loc[1:]
                return df
            elif (return_type == 'json'):
                raise Exception('API returned csv format, unable to convert to JSON')

    def _merge_symbols_for_url(self, symbols):
        if (type(symbols) == str):
            return symbols
        elif (type(symbols) == list):
            return_string = ''
            for symbol in symbols:
                return_string += symbol + ','
            return return_string
        else:
            raise Exception('Unknown type given for symbols.')

    """------- STOCK FUNDAMENTALS -------"""

    def financial_statement_symbol_lists(self, return_type='json'):
        """List of symbols that have financial statements.
        
        Args:
            return_type (str): 'json' | 'df' depending on the desired return format.

        Returns: 
            Either a list or pandas.DataFrame with the stock symbols.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/financial-statement-symbol-lists'.format(BASE_URL_V3)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def income_statement(self, symbol, period='annual', limit=None, return_type='json'):
        """List of historical income statements for the symbol.
        
        Args:
            symbol (str): Stock ticker symbol.
            period (str): 'annual' | 'quarter'.
            limit (int): Maximum number of periods to return.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the income statements.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/income-statement/{}'.format(BASE_URL_V3, symbol)
        payload = {
            'apikey': self._api_key, 
            'period': period
        }
        if limit is not None:
            payload['limit'] = limit
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def balance_sheet_statement(self, symbol, period='annual', limit=None, return_type='json'):
        """List of historical balance sheets for the symbol.
        
        Args:
            symbol (str): Stock ticker symbol.
            period (str): 'annual' | 'quarter'.
            limit (int): Maximum number of periods to return.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the balance sheets.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/balance-sheet-statement/{}'.format(BASE_URL_V3, symbol)
        payload = {
            'apikey': self._api_key, 
            'period': period
        }
        if limit is not None:
            payload['limit'] = limit
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def cash_flow_statement(self, symbol, period='annual', limit=None, return_type='json'):
        """List of historical balance sheets for the symbol.
        
        Args:
            symbol (str): Stock ticker symbol.
            period (str): 'annual' | 'quarter'.
            limit (int): Maximum number of periods to return.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the cash flow statements.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/cash-flow-statement/{}'.format(BASE_URL_V3, symbol)
        payload = {
            'apikey': self._api_key, 
            'period': period
        }
        if limit is not None:
            payload['limit'] = limit
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def financial_report_dates(self, symbol, return_type='json'):
        """Returns dates and links to data.
        
        Args:
            symbol (str): Stock ticker symbol.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the report dates.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/financial-reports-dates'.format(BASE_URL_V4)
        payload = {
            'apikey': self._api_key, 
            'symbol': symbol
        }
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    """------- STOCK FUNDAMENTAL ANALYSIS -------"""

    """------- INSTITUTIONAL STOCK OWNERSHIP -------"""

    """------- ESG SCORE -------"""

    """------- PRICE TARGET -------"""

    """------- UPGRADES & DOWNGRADES -------"""

    """------- HISTORICAL ETF AND MUTUAL FUND HOLDINGS -------"""

    """------- HISTORICAL NUMBER OF EMPLOYEES -------"""

    """------- EXECUTIVE COMPENSATION -------"""

    """------- INDIVIDUAL BENEFICIAL OWNERSHIP -------"""

    """------- STOCK CALENDARS -------"""

    """------- STOCK LOOK UP TOOL -------"""

    """------- COMPANY INFORMATION -------"""

    def company_profile(self, symbol, return_type='json'):
        """General information about a company.
        
        Args:
            symbol (str): Stock ticker symbol.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the company's profile information.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/profile/{}'.format(BASE_URL_V3, symbol)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def key_executives(self, symbol, return_type='json'):
        """Information about company executives.
        
        Args:
            symbol (str): Stock ticker symbol.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the executive information.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/key-executives/{}'.format(BASE_URL_V3, symbol)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def market_capitalization(self, symbol, return_type='json'):
        """Gets the symbols market capitalization.
        
        Args:
            symbol (str): Stock ticker symbol.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the market cap.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/market-capitalization/{}'.format(BASE_URL_V3, symbol)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def historical_market_capitalization(self, symbol, limit=None, return_type='json'):
        """Gets the history of the company's market capitalization.
        
        Args:
            symbol (str): Stock ticker symbol.
            limit (int): Number of days returned.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the historicals capitalizations.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/historical-market-capitalization/{}'.format(BASE_URL_V3, symbol)
        payload = {
            'apikey': self._api_key
        }
        if limit is not None:
            payload['limit'] = limit
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def company_outlook(self, symbol):
        """Returns a variety of current metrics on the given company.
        
        Args:
            symbol (str): Stock ticker symbol.

        Returns: 
            A dict with the company's metrics.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/company-outlook'.format(BASE_URL_V4)
        payload = {
            'apikey': self._api_key, 
            'symbol': symbol
        }
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type='json')

    def stock_peers(self, symbol, return_type='json'):
        """Stock peers based on sector, exchange and market cap.
        
        Args:
            symbol (str): Stock ticker symbol.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the stocks peers.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/stock_peers'.format(BASE_URL_V4)
        payload = {
            'apikey': self._api_key, 
            'symbol': symbol
        }
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def is_the_market_open(self):
        """Returns the hours that the market is open and which markets currently are.
        
        Returns: 
            A dict with information about the market hours.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/is-the-market-open'.format(BASE_URL_V3)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type='json')

    def company_core_information(self, symbol, return_type='json'):
        """Returns a company's core information.
        
        Args:
            symbol (str): Stock ticker symbol.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the stocks peers.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/company-core-information'.format(BASE_URL_V4)
        payload = {
            'apikey': self._api_key, 
            'symbol': symbol
        }
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    """------- STOCK NEWS -------"""

    """------- MARKET PERFORMANCE -------"""

    """------- ADVANCED DATA -------"""

    """------- STOCK STATISTICS -------"""

    """------- INSIDER TRADING -------"""

    """------- ECONOMICS -------"""

    """------- STOCK PRICE -------"""

    def quote(self, symbols, return_type='json'):
        """Gets the most recent price quote for one or more stock symbols.
        
        Args:
            symbols (str | str list): Stock ticker symbol or symbols.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the stock quotes.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/quote/{}'.format(BASE_URL_V3, self._merge_symbols_for_url(symbols))
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def otc_quote(self, symbols, return_type='json'):
        """Gets the most recent price quote for one or more OTC stock symbols.
        
        Args:
            symbols (str | str list): Stock ticker symbol or symbols.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the stock quotes.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/otc/real-time-price/{}'.format(BASE_URL_V3, self._merge_symbols_for_url(symbols))
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def historical_price_interval(self, symbol, start_date, end_date=TODAY, return_type='json'):
        """Gets the stocks daily history from start_date to end_date.
        
        Args:
            symbols (str | str list): Stock ticker symbol or symbols.
            start_date (str): Start date of the range.
            end_date (str): End date of the range.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the stock history. Returns 
                an empty list or empty pandas.DataFrame if the API did not return any history.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/historical-price-full/{}'.format(BASE_URL_V3, symbol)
        payload = {
            'apikey': self._api_key, 
            'from': start_date, 
            'to': end_date
        }
        response = requests.get(url=endpoint, params=payload)
        processed_json = self._process_response(response, response_type='json', return_type='json')
        
        if (processed_json == {}):
            if (return_type == 'json'):
                return {}
            elif (return_type == 'df'):
                return pd.DataFrame()
        else:
            return self._process_response(response, response_type='json', return_type=return_type)

        # try:
        #     historical_json = response.json()['historical']
        # except:
        #     return None
        # if (return_type == 'json'):
        #     return response.json()
        # elif (return_type == 'df'):
        #     return pd.DataFrame(historical_json)

    def historical_price_full(self, symbol, return_type='json'):
        """Gets the full daily history for a symbol.
        
        Args:
            symbols (str | str list): Stock ticker symbol or symbols.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the stock history.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        return self.historical_price_interval(symbol, '1900-01-01', TODAY, return_type=return_type)

    """------- FUND HOLDINGS -------"""

    """------- WEBSOCKET -------"""

    """------- STOCK LIST -------"""

    def symbols_list(self, return_type='json'):
        """Returns a list of available symbols with their full names, exchanges, and prices.
        
        Args:
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the symbols list.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/stock/list'.format(BASE_URL_V3)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def tradable_symbols_list(self, return_type='json'):
        """Returns a list of tradable symbols.
        
        Args:
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the symbols list.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/available-traded/list'.format(BASE_URL_V3)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def etf_list(self, return_type='json'):
        """Returns a list of available etf's, a subset of the symbols list.
        
        Args:
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the etf list.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/etf/list'.format(BASE_URL_V3)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    """------- BULK AND BATCH -------"""

    def batch_quote_prices(self, symbols_list, return_type='json'):
        """Returns a list of prices for the given symbols.
        
        Args:
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with quotes.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/quote/{}'.format(BASE_URL_V3, self._merge_symbols_for_url(symbols_list))
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def batch_request_end_of_day_prices(self, date):
        """Returns a list of prices for the given symbols.
        
        Args:
            return_type (str): 'json' | 'df'.

        Returns: 
            A pandas.DataFrame with quotes.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/batch-request-end-of-day-prices'.format(BASE_URL_V4)
        payload = {
            'apikey': self._api_key, 
            'date': date
        }
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='csv', return_type='df')

    """------- MARKET INDEXES -------"""

    """------- EURONEXT -------"""

    """------- TSX -------"""

    """------- CRYPTO & FOREX & COMMODITIES -------"""

Classes

class FMPClient (api_key=None)

Python wrapper for the Financial Modeling Prep (FMP) API.

Makes call requests to the FMP API and returns the results. Currently, only some of the endpoints under the personal plan are implemented, and none from the professional or enterprise versions. Most requests can have the response be formatted either in the original json or as a pandas.DataFrame, although some enpoints do not have support for a DataFrame return.

In order to use the API, an API key must be used. This can either be passed into the constructor or added to the environmental variables under the name FMP_API_KEY.

Args

api_key : str
FMP API key.
Expand source code
class FMPClient:
    """Python wrapper for the Financial Modeling Prep (FMP) API.
    
    Makes call requests to the FMP API and returns the results. Currently, 
    only some of the endpoints under the personal plan are implemented, and none 
    from the professional or enterprise versions. Most requests can have the response
    be formatted either in the original json or as a pandas.DataFrame, although 
    some enpoints do not have support for a DataFrame return.

    In order to use the API, an API key must be used. This can either be passed into 
    the constructor or added to the environmental variables under the name FMP_API_KEY.

    Args:
        api_key (str): FMP API key.
    """

    def __init__(self, api_key=None):
        self._api_key = api_key or os.getenv('FMP_API_KEY')
        self._empty_payload = {
            'apikey': self._api_key
        }

    def _process_response(self, response, response_type, return_type):
        """Converts the response from the API into the given response type.
        
        Args:
            response (requests.models.response): API response from the requests.get method.
            response_type (str): 'json' | 'csv' depending on the type of API response.
            return_type (str): 'json' | 'df' depending on the desired return format.

        Returns: 
            Either a list or pandas.DataFrame with the response content.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        if (response.status_code == TOO_MANY_REQUESTS):
            raise TooManyRequestsException()
        elif (response.status_code != OK):
            raise requests.RequestException()

        if (response_type == 'json'):
            content = response.json()

            if (return_type == 'json'):
                return content
            elif (return_type == 'df'):
                return pd.DataFrame(content)

        elif (response_type == 'csv'):
            content = list(csv.reader(response.content.decode('utf-8').splitlines(), delimiter=','))

            if (return_type == 'df'):
                df = pd.DataFrame(list(content))
                df = df.rename(columns=df.iloc[0], inplace=False).loc[1:]
                return df
            elif (return_type == 'json'):
                raise Exception('API returned csv format, unable to convert to JSON')

    def _merge_symbols_for_url(self, symbols):
        if (type(symbols) == str):
            return symbols
        elif (type(symbols) == list):
            return_string = ''
            for symbol in symbols:
                return_string += symbol + ','
            return return_string
        else:
            raise Exception('Unknown type given for symbols.')

    """------- STOCK FUNDAMENTALS -------"""

    def financial_statement_symbol_lists(self, return_type='json'):
        """List of symbols that have financial statements.
        
        Args:
            return_type (str): 'json' | 'df' depending on the desired return format.

        Returns: 
            Either a list or pandas.DataFrame with the stock symbols.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/financial-statement-symbol-lists'.format(BASE_URL_V3)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def income_statement(self, symbol, period='annual', limit=None, return_type='json'):
        """List of historical income statements for the symbol.
        
        Args:
            symbol (str): Stock ticker symbol.
            period (str): 'annual' | 'quarter'.
            limit (int): Maximum number of periods to return.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the income statements.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/income-statement/{}'.format(BASE_URL_V3, symbol)
        payload = {
            'apikey': self._api_key, 
            'period': period
        }
        if limit is not None:
            payload['limit'] = limit
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def balance_sheet_statement(self, symbol, period='annual', limit=None, return_type='json'):
        """List of historical balance sheets for the symbol.
        
        Args:
            symbol (str): Stock ticker symbol.
            period (str): 'annual' | 'quarter'.
            limit (int): Maximum number of periods to return.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the balance sheets.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/balance-sheet-statement/{}'.format(BASE_URL_V3, symbol)
        payload = {
            'apikey': self._api_key, 
            'period': period
        }
        if limit is not None:
            payload['limit'] = limit
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def cash_flow_statement(self, symbol, period='annual', limit=None, return_type='json'):
        """List of historical balance sheets for the symbol.
        
        Args:
            symbol (str): Stock ticker symbol.
            period (str): 'annual' | 'quarter'.
            limit (int): Maximum number of periods to return.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the cash flow statements.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/cash-flow-statement/{}'.format(BASE_URL_V3, symbol)
        payload = {
            'apikey': self._api_key, 
            'period': period
        }
        if limit is not None:
            payload['limit'] = limit
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def financial_report_dates(self, symbol, return_type='json'):
        """Returns dates and links to data.
        
        Args:
            symbol (str): Stock ticker symbol.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the report dates.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/financial-reports-dates'.format(BASE_URL_V4)
        payload = {
            'apikey': self._api_key, 
            'symbol': symbol
        }
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    """------- STOCK FUNDAMENTAL ANALYSIS -------"""

    """------- INSTITUTIONAL STOCK OWNERSHIP -------"""

    """------- ESG SCORE -------"""

    """------- PRICE TARGET -------"""

    """------- UPGRADES & DOWNGRADES -------"""

    """------- HISTORICAL ETF AND MUTUAL FUND HOLDINGS -------"""

    """------- HISTORICAL NUMBER OF EMPLOYEES -------"""

    """------- EXECUTIVE COMPENSATION -------"""

    """------- INDIVIDUAL BENEFICIAL OWNERSHIP -------"""

    """------- STOCK CALENDARS -------"""

    """------- STOCK LOOK UP TOOL -------"""

    """------- COMPANY INFORMATION -------"""

    def company_profile(self, symbol, return_type='json'):
        """General information about a company.
        
        Args:
            symbol (str): Stock ticker symbol.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the company's profile information.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/profile/{}'.format(BASE_URL_V3, symbol)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def key_executives(self, symbol, return_type='json'):
        """Information about company executives.
        
        Args:
            symbol (str): Stock ticker symbol.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the executive information.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/key-executives/{}'.format(BASE_URL_V3, symbol)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def market_capitalization(self, symbol, return_type='json'):
        """Gets the symbols market capitalization.
        
        Args:
            symbol (str): Stock ticker symbol.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the market cap.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/market-capitalization/{}'.format(BASE_URL_V3, symbol)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def historical_market_capitalization(self, symbol, limit=None, return_type='json'):
        """Gets the history of the company's market capitalization.
        
        Args:
            symbol (str): Stock ticker symbol.
            limit (int): Number of days returned.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the historicals capitalizations.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/historical-market-capitalization/{}'.format(BASE_URL_V3, symbol)
        payload = {
            'apikey': self._api_key
        }
        if limit is not None:
            payload['limit'] = limit
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def company_outlook(self, symbol):
        """Returns a variety of current metrics on the given company.
        
        Args:
            symbol (str): Stock ticker symbol.

        Returns: 
            A dict with the company's metrics.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/company-outlook'.format(BASE_URL_V4)
        payload = {
            'apikey': self._api_key, 
            'symbol': symbol
        }
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type='json')

    def stock_peers(self, symbol, return_type='json'):
        """Stock peers based on sector, exchange and market cap.
        
        Args:
            symbol (str): Stock ticker symbol.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the stocks peers.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/stock_peers'.format(BASE_URL_V4)
        payload = {
            'apikey': self._api_key, 
            'symbol': symbol
        }
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def is_the_market_open(self):
        """Returns the hours that the market is open and which markets currently are.
        
        Returns: 
            A dict with information about the market hours.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/is-the-market-open'.format(BASE_URL_V3)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type='json')

    def company_core_information(self, symbol, return_type='json'):
        """Returns a company's core information.
        
        Args:
            symbol (str): Stock ticker symbol.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the stocks peers.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/company-core-information'.format(BASE_URL_V4)
        payload = {
            'apikey': self._api_key, 
            'symbol': symbol
        }
        response = requests.get(url=endpoint, params=payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    """------- STOCK NEWS -------"""

    """------- MARKET PERFORMANCE -------"""

    """------- ADVANCED DATA -------"""

    """------- STOCK STATISTICS -------"""

    """------- INSIDER TRADING -------"""

    """------- ECONOMICS -------"""

    """------- STOCK PRICE -------"""

    def quote(self, symbols, return_type='json'):
        """Gets the most recent price quote for one or more stock symbols.
        
        Args:
            symbols (str | str list): Stock ticker symbol or symbols.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the stock quotes.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/quote/{}'.format(BASE_URL_V3, self._merge_symbols_for_url(symbols))
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def otc_quote(self, symbols, return_type='json'):
        """Gets the most recent price quote for one or more OTC stock symbols.
        
        Args:
            symbols (str | str list): Stock ticker symbol or symbols.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the stock quotes.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/otc/real-time-price/{}'.format(BASE_URL_V3, self._merge_symbols_for_url(symbols))
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def historical_price_interval(self, symbol, start_date, end_date=TODAY, return_type='json'):
        """Gets the stocks daily history from start_date to end_date.
        
        Args:
            symbols (str | str list): Stock ticker symbol or symbols.
            start_date (str): Start date of the range.
            end_date (str): End date of the range.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the stock history. Returns 
                an empty list or empty pandas.DataFrame if the API did not return any history.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/historical-price-full/{}'.format(BASE_URL_V3, symbol)
        payload = {
            'apikey': self._api_key, 
            'from': start_date, 
            'to': end_date
        }
        response = requests.get(url=endpoint, params=payload)
        processed_json = self._process_response(response, response_type='json', return_type='json')
        
        if (processed_json == {}):
            if (return_type == 'json'):
                return {}
            elif (return_type == 'df'):
                return pd.DataFrame()
        else:
            return self._process_response(response, response_type='json', return_type=return_type)

        # try:
        #     historical_json = response.json()['historical']
        # except:
        #     return None
        # if (return_type == 'json'):
        #     return response.json()
        # elif (return_type == 'df'):
        #     return pd.DataFrame(historical_json)

    def historical_price_full(self, symbol, return_type='json'):
        """Gets the full daily history for a symbol.
        
        Args:
            symbols (str | str list): Stock ticker symbol or symbols.
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the stock history.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        return self.historical_price_interval(symbol, '1900-01-01', TODAY, return_type=return_type)

    """------- FUND HOLDINGS -------"""

    """------- WEBSOCKET -------"""

    """------- STOCK LIST -------"""

    def symbols_list(self, return_type='json'):
        """Returns a list of available symbols with their full names, exchanges, and prices.
        
        Args:
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the symbols list.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/stock/list'.format(BASE_URL_V3)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def tradable_symbols_list(self, return_type='json'):
        """Returns a list of tradable symbols.
        
        Args:
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the symbols list.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/available-traded/list'.format(BASE_URL_V3)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def etf_list(self, return_type='json'):
        """Returns a list of available etf's, a subset of the symbols list.
        
        Args:
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with the etf list.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/etf/list'.format(BASE_URL_V3)
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    """------- BULK AND BATCH -------"""

    def batch_quote_prices(self, symbols_list, return_type='json'):
        """Returns a list of prices for the given symbols.
        
        Args:
            return_type (str): 'json' | 'df'.

        Returns: 
            Either a list or pandas.DataFrame with quotes.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/quote/{}'.format(BASE_URL_V3, self._merge_symbols_for_url(symbols_list))
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='json', return_type=return_type)

    def batch_request_end_of_day_prices(self, date):
        """Returns a list of prices for the given symbols.
        
        Args:
            return_type (str): 'json' | 'df'.

        Returns: 
            A pandas.DataFrame with quotes.

        Raises:
            fmp_api_python.fmp.TooManyRequestsException: This is returned 
                after a 429 response by the API.
            requests.RequestException: Returned if any status code other than 200 
                is returned by the API. 
        """
        endpoint = r'{}/batch-request-end-of-day-prices'.format(BASE_URL_V4)
        payload = {
            'apikey': self._api_key, 
            'date': date
        }
        response = requests.get(url=endpoint, params=self._empty_payload)
        return self._process_response(response, response_type='csv', return_type='df')

    """------- MARKET INDEXES -------"""

    """------- EURONEXT -------"""

    """------- TSX -------"""

    """------- CRYPTO & FOREX & COMMODITIES -------"""

Methods

def balance_sheet_statement(self, symbol, period='annual', limit=None, return_type='json')

List of historical balance sheets for the symbol.

Args

symbol : str
Stock ticker symbol.
period : str
'annual' | 'quarter'.
limit : int
Maximum number of periods to return.
return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the balance sheets.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def balance_sheet_statement(self, symbol, period='annual', limit=None, return_type='json'):
    """List of historical balance sheets for the symbol.
    
    Args:
        symbol (str): Stock ticker symbol.
        period (str): 'annual' | 'quarter'.
        limit (int): Maximum number of periods to return.
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the balance sheets.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/balance-sheet-statement/{}'.format(BASE_URL_V3, symbol)
    payload = {
        'apikey': self._api_key, 
        'period': period
    }
    if limit is not None:
        payload['limit'] = limit
    response = requests.get(url=endpoint, params=payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def batch_quote_prices(self, symbols_list, return_type='json')

Returns a list of prices for the given symbols.

Args

return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with quotes.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def batch_quote_prices(self, symbols_list, return_type='json'):
    """Returns a list of prices for the given symbols.
    
    Args:
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with quotes.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/quote/{}'.format(BASE_URL_V3, self._merge_symbols_for_url(symbols_list))
    response = requests.get(url=endpoint, params=self._empty_payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def batch_request_end_of_day_prices(self, date)

Returns a list of prices for the given symbols.

Args

return_type : str
'json' | 'df'.

Returns: A pandas.DataFrame with quotes.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def batch_request_end_of_day_prices(self, date):
    """Returns a list of prices for the given symbols.
    
    Args:
        return_type (str): 'json' | 'df'.

    Returns: 
        A pandas.DataFrame with quotes.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/batch-request-end-of-day-prices'.format(BASE_URL_V4)
    payload = {
        'apikey': self._api_key, 
        'date': date
    }
    response = requests.get(url=endpoint, params=self._empty_payload)
    return self._process_response(response, response_type='csv', return_type='df')
def cash_flow_statement(self, symbol, period='annual', limit=None, return_type='json')

List of historical balance sheets for the symbol.

Args

symbol : str
Stock ticker symbol.
period : str
'annual' | 'quarter'.
limit : int
Maximum number of periods to return.
return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the cash flow statements.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def cash_flow_statement(self, symbol, period='annual', limit=None, return_type='json'):
    """List of historical balance sheets for the symbol.
    
    Args:
        symbol (str): Stock ticker symbol.
        period (str): 'annual' | 'quarter'.
        limit (int): Maximum number of periods to return.
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the cash flow statements.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/cash-flow-statement/{}'.format(BASE_URL_V3, symbol)
    payload = {
        'apikey': self._api_key, 
        'period': period
    }
    if limit is not None:
        payload['limit'] = limit
    response = requests.get(url=endpoint, params=payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def company_core_information(self, symbol, return_type='json')

Returns a company's core information.

Args

symbol : str
Stock ticker symbol.
return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the stocks peers.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def company_core_information(self, symbol, return_type='json'):
    """Returns a company's core information.
    
    Args:
        symbol (str): Stock ticker symbol.
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the stocks peers.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/company-core-information'.format(BASE_URL_V4)
    payload = {
        'apikey': self._api_key, 
        'symbol': symbol
    }
    response = requests.get(url=endpoint, params=payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def company_outlook(self, symbol)

Returns a variety of current metrics on the given company.

Args

symbol : str
Stock ticker symbol.

Returns: A dict with the company's metrics.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def company_outlook(self, symbol):
    """Returns a variety of current metrics on the given company.
    
    Args:
        symbol (str): Stock ticker symbol.

    Returns: 
        A dict with the company's metrics.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/company-outlook'.format(BASE_URL_V4)
    payload = {
        'apikey': self._api_key, 
        'symbol': symbol
    }
    response = requests.get(url=endpoint, params=payload)
    return self._process_response(response, response_type='json', return_type='json')
def company_profile(self, symbol, return_type='json')

General information about a company.

Args

symbol : str
Stock ticker symbol.
return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the company's profile information.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def company_profile(self, symbol, return_type='json'):
    """General information about a company.
    
    Args:
        symbol (str): Stock ticker symbol.
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the company's profile information.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/profile/{}'.format(BASE_URL_V3, symbol)
    response = requests.get(url=endpoint, params=self._empty_payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def etf_list(self, return_type='json')

Returns a list of available etf's, a subset of the symbols list.

Args

return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the etf list.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def etf_list(self, return_type='json'):
    """Returns a list of available etf's, a subset of the symbols list.
    
    Args:
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the etf list.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/etf/list'.format(BASE_URL_V3)
    response = requests.get(url=endpoint, params=self._empty_payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def financial_report_dates(self, symbol, return_type='json')

Returns dates and links to data.

Args

symbol : str
Stock ticker symbol.
return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the report dates.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def financial_report_dates(self, symbol, return_type='json'):
    """Returns dates and links to data.
    
    Args:
        symbol (str): Stock ticker symbol.
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the report dates.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/financial-reports-dates'.format(BASE_URL_V4)
    payload = {
        'apikey': self._api_key, 
        'symbol': symbol
    }
    response = requests.get(url=endpoint, params=payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def financial_statement_symbol_lists(self, return_type='json')

List of symbols that have financial statements.

Args

return_type : str
'json' | 'df' depending on the desired return format.

Returns: Either a list or pandas.DataFrame with the stock symbols.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def financial_statement_symbol_lists(self, return_type='json'):
    """List of symbols that have financial statements.
    
    Args:
        return_type (str): 'json' | 'df' depending on the desired return format.

    Returns: 
        Either a list or pandas.DataFrame with the stock symbols.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/financial-statement-symbol-lists'.format(BASE_URL_V3)
    response = requests.get(url=endpoint, params=self._empty_payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def historical_market_capitalization(self, symbol, limit=None, return_type='json')

Gets the history of the company's market capitalization.

Args

symbol : str
Stock ticker symbol.
limit : int
Number of days returned.
return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the historicals capitalizations.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def historical_market_capitalization(self, symbol, limit=None, return_type='json'):
    """Gets the history of the company's market capitalization.
    
    Args:
        symbol (str): Stock ticker symbol.
        limit (int): Number of days returned.
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the historicals capitalizations.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/historical-market-capitalization/{}'.format(BASE_URL_V3, symbol)
    payload = {
        'apikey': self._api_key
    }
    if limit is not None:
        payload['limit'] = limit
    response = requests.get(url=endpoint, params=payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def historical_price_full(self, symbol, return_type='json')

Gets the full daily history for a symbol.

Args

symbols (str | str list): Stock ticker symbol or symbols.
return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the stock history.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def historical_price_full(self, symbol, return_type='json'):
    """Gets the full daily history for a symbol.
    
    Args:
        symbols (str | str list): Stock ticker symbol or symbols.
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the stock history.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    return self.historical_price_interval(symbol, '1900-01-01', TODAY, return_type=return_type)
def historical_price_interval(self, symbol, start_date, end_date=datetime.date(2022, 6, 16), return_type='json')

Gets the stocks daily history from start_date to end_date.

Args

symbols (str | str list): Stock ticker symbol or symbols.
start_date : str
Start date of the range.
end_date : str
End date of the range.
return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the stock history. Returns an empty list or empty pandas.DataFrame if the API did not return any history.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def historical_price_interval(self, symbol, start_date, end_date=TODAY, return_type='json'):
    """Gets the stocks daily history from start_date to end_date.
    
    Args:
        symbols (str | str list): Stock ticker symbol or symbols.
        start_date (str): Start date of the range.
        end_date (str): End date of the range.
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the stock history. Returns 
            an empty list or empty pandas.DataFrame if the API did not return any history.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/historical-price-full/{}'.format(BASE_URL_V3, symbol)
    payload = {
        'apikey': self._api_key, 
        'from': start_date, 
        'to': end_date
    }
    response = requests.get(url=endpoint, params=payload)
    processed_json = self._process_response(response, response_type='json', return_type='json')
    
    if (processed_json == {}):
        if (return_type == 'json'):
            return {}
        elif (return_type == 'df'):
            return pd.DataFrame()
    else:
        return self._process_response(response, response_type='json', return_type=return_type)
def income_statement(self, symbol, period='annual', limit=None, return_type='json')

List of historical income statements for the symbol.

Args

symbol : str
Stock ticker symbol.
period : str
'annual' | 'quarter'.
limit : int
Maximum number of periods to return.
return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the income statements.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def income_statement(self, symbol, period='annual', limit=None, return_type='json'):
    """List of historical income statements for the symbol.
    
    Args:
        symbol (str): Stock ticker symbol.
        period (str): 'annual' | 'quarter'.
        limit (int): Maximum number of periods to return.
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the income statements.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/income-statement/{}'.format(BASE_URL_V3, symbol)
    payload = {
        'apikey': self._api_key, 
        'period': period
    }
    if limit is not None:
        payload['limit'] = limit
    response = requests.get(url=endpoint, params=payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def is_the_market_open(self)

Returns the hours that the market is open and which markets currently are.

Returns: A dict with information about the market hours.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def is_the_market_open(self):
    """Returns the hours that the market is open and which markets currently are.
    
    Returns: 
        A dict with information about the market hours.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/is-the-market-open'.format(BASE_URL_V3)
    response = requests.get(url=endpoint, params=self._empty_payload)
    return self._process_response(response, response_type='json', return_type='json')
def key_executives(self, symbol, return_type='json')

Information about company executives.

Args

symbol : str
Stock ticker symbol.
return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the executive information.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def key_executives(self, symbol, return_type='json'):
    """Information about company executives.
    
    Args:
        symbol (str): Stock ticker symbol.
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the executive information.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/key-executives/{}'.format(BASE_URL_V3, symbol)
    response = requests.get(url=endpoint, params=self._empty_payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def market_capitalization(self, symbol, return_type='json')

Gets the symbols market capitalization.

Args

symbol : str
Stock ticker symbol.
return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the market cap.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def market_capitalization(self, symbol, return_type='json'):
    """Gets the symbols market capitalization.
    
    Args:
        symbol (str): Stock ticker symbol.
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the market cap.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/market-capitalization/{}'.format(BASE_URL_V3, symbol)
    response = requests.get(url=endpoint, params=self._empty_payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def otc_quote(self, symbols, return_type='json')

Gets the most recent price quote for one or more OTC stock symbols.

Args

symbols (str | str list): Stock ticker symbol or symbols.
return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the stock quotes.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def otc_quote(self, symbols, return_type='json'):
    """Gets the most recent price quote for one or more OTC stock symbols.
    
    Args:
        symbols (str | str list): Stock ticker symbol or symbols.
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the stock quotes.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/otc/real-time-price/{}'.format(BASE_URL_V3, self._merge_symbols_for_url(symbols))
    response = requests.get(url=endpoint, params=self._empty_payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def quote(self, symbols, return_type='json')

Gets the most recent price quote for one or more stock symbols.

Args

symbols (str | str list): Stock ticker symbol or symbols.
return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the stock quotes.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def quote(self, symbols, return_type='json'):
    """Gets the most recent price quote for one or more stock symbols.
    
    Args:
        symbols (str | str list): Stock ticker symbol or symbols.
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the stock quotes.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/quote/{}'.format(BASE_URL_V3, self._merge_symbols_for_url(symbols))
    response = requests.get(url=endpoint, params=self._empty_payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def stock_peers(self, symbol, return_type='json')

Stock peers based on sector, exchange and market cap.

Args

symbol : str
Stock ticker symbol.
return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the stocks peers.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def stock_peers(self, symbol, return_type='json'):
    """Stock peers based on sector, exchange and market cap.
    
    Args:
        symbol (str): Stock ticker symbol.
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the stocks peers.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/stock_peers'.format(BASE_URL_V4)
    payload = {
        'apikey': self._api_key, 
        'symbol': symbol
    }
    response = requests.get(url=endpoint, params=payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def symbols_list(self, return_type='json')

Returns a list of available symbols with their full names, exchanges, and prices.

Args

return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the symbols list.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def symbols_list(self, return_type='json'):
    """Returns a list of available symbols with their full names, exchanges, and prices.
    
    Args:
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the symbols list.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/stock/list'.format(BASE_URL_V3)
    response = requests.get(url=endpoint, params=self._empty_payload)
    return self._process_response(response, response_type='json', return_type=return_type)
def tradable_symbols_list(self, return_type='json')

Returns a list of tradable symbols.

Args

return_type : str
'json' | 'df'.

Returns: Either a list or pandas.DataFrame with the symbols list.

Raises

fmp_api_python.fmp.TooManyRequestsException
This is returned after a 429 response by the API.
requests.RequestException
Returned if any status code other than 200 is returned by the API.
Expand source code
def tradable_symbols_list(self, return_type='json'):
    """Returns a list of tradable symbols.
    
    Args:
        return_type (str): 'json' | 'df'.

    Returns: 
        Either a list or pandas.DataFrame with the symbols list.

    Raises:
        fmp_api_python.fmp.TooManyRequestsException: This is returned 
            after a 429 response by the API.
        requests.RequestException: Returned if any status code other than 200 
            is returned by the API. 
    """
    endpoint = r'{}/available-traded/list'.format(BASE_URL_V3)
    response = requests.get(url=endpoint, params=self._empty_payload)
    return self._process_response(response, response_type='json', return_type=return_type)
class TooManyRequestsException

Raised when a 429 too many requests error was returned by the API.

Initialize RequestException with request and response objects.

Expand source code
class TooManyRequestsException(requests.RequestException):
    """Raised when a 429 too many requests error was returned by the API."""
    
    def __init__(self):
        super().__init__('The FMP API rate limit was exceeded')

Ancestors

  • requests.exceptions.RequestException
  • builtins.OSError
  • builtins.Exception
  • builtins.BaseException